1. 程式人生 > >機器學習(3):機器的進化-迭代學習

機器學習(3):機器的進化-迭代學習

之前介紹的簡單線性迴歸,就是一個迴歸模型,是一個可用於機器學習的模型。什麼意思呢?就是模型的狀態(引數集合)是可以進化的,只要合理訓練它,模型就能取得更好的預測狀態,所以說模型可用於機器學習。

要應用機器學習,一開始就要考慮選擇一個良好的模型(分類模型或迴歸模型),想清楚了,這步是很重要的,如果你選擇了一個不對口的模型,你可能花了半輩子的樣本挑選與訓練,也得不到一個好的模型狀態,最終預測不到好的結果。但這裡講的不是怎麼選擇模型,而是想說,模型是怎麼進化的,也就是訓練的過程是怎麼樣的。

又是一些枯燥的內容,但是我也沒有辦法,難道枯燥就不去了解嗎?或者你有更好的表達辦法?

(一)迭代訓練的概念

你可能已經想像到,訓練會一直在調整模型的引數。是的,訓練就是要強大,強大就是要固化出最好的引數集合,跟你全面鍛鍊身體一樣,你體重多少?

為了更具體地理解訓練的執行原理,可以參考以下這張圖(圖片源於:https://developers.google.com/machine-learning/crash-course/reducing-loss/an-iterative-approach):

因為訓練接受的樣本是帶標籤的,所以交給模型的是特徵與標籤的組合,但你要注意,模型處理的是“所有”樣本,它對“所有”樣本進行預測,得到一堆預測標籤,然後再計算誤差或損失,然後再調整引數。所以你不要理解為一定是先處理一個樣本就調參然後再來一個樣本。這裡,我留了一個後路,為了計算損失,並不一定要所有樣本參與,甚至可以一次迭代只用一個樣本,這個在最後再說。

比如,套用之前的簡單線性迴歸模型,根據關係y=mx+b,每一個樣本都得到預測標籤。之後,根據預測標籤與真實標籤,進行損失計算,比如按均方誤差計算出損失,如果損失已經很小了,或者若干次調整都不能讓損失變小或變小的幅度很小,那你可以下結論了:這個就是最小損失,不用再訓練了,模型的狀態是最fit的了--這個叫訓練收斂。

如果損失比上一次還小(還小很多)而且還不是你以為最小的值,那說明什麼?說明還有好處可撈啊,還要調整引數以取得更小的損失啊。那調整引數之後,是不是預測效果就更好了呢?不知道!這時要對所有樣本再預測一遍、再計算一次損失,才知道。於是,迭代開始了。

如此,反覆迭代預測、算損失、調參的流程,至到天荒地老(即收斂,收斂了就放過它)。迭代的過程是自驅動的,這個是機器學習的特點。

迭代的流程是比較重要的概念(能讓你較全域性地理解機器學習),你有必要在腦海中多想一下這個情景,為了配合你,小程把一元迴歸模型的圖放在下面,你想像一下,圖裡面的那根線,調整一個角度後,對所有點算一次損失,如果不是最小損失,就再調整一個角度...

上面多次說到調整引數,說得輕巧,怎麼調整?隨便加1或減1嗎?

(二)調整模型引數的辦法

在迭代學習的過程中,機器會自驅動地調整模型的引數。調整模型的引數是機器學習的一個重要環節,那麼,如何調整模型的引數呢?

以簡單的一元迴歸(是一塊錢回到家的意思嗎?)為例:y=wx+b,要調整的引數就是w跟b,怎麼調?首先你要記得你的目的,你調參的目的,是為了得到最小損失,那w跟b是何值時,才是最小損失呢?

先說一個不經過設計的自然的想法,假設先調整w(b先隨便固定一個值),如果我能把所有的w值的損失都計算出來了,也就是對於w取{1,-1,2,2.5,...}各個值時,都算出所有點的整體損失,那不是有最小損失了嗎?最小損失對應的那個w值就是最佳的引數啊。

想法是沒錯的,但是,一般來說,越自然的想法,越不是一個好的演算法。

演算法就是設計的東西。怎麼調整出最佳引數,同樣有更好的演算法,而不是對所有w值全量計算(效率太低了!),其中一個常用演算法叫梯度下降法。

首先要理解一個前提。據研究(不是我的研究),損失跟權重的關係,是一個碗狀圖(這就是損失函式),就是這個:

有什麼特點?一個特點是,有一個最低點,就是損失最小的點,這個就是我們的目標(對應的w值就是最佳引數),另一個特點是,沿著碗邊走,只要方向對而且移動幅度足夠小,就一定能到達最低點。

要到達遠方,現在就要出發。這裡有兩個關鍵點,一個是方向,一個是移動幅度。

怎麼確定方向呢?比如對於曲線,往左還是往右(即w是增加還是減小),對於曲面呢?

這時,梯度下降法來幫你,它可以有效地去到最低點。


以下分隔線內的東西,橫空而來,你若有興趣則讀一讀,它告訴你,什麼是梯度。

什麼是導數?

導數是函式的導數,函式只有一個自變數時叫導數(否則叫偏導數)。直觀點,函式都是曲線,所以導數就是曲線上某一點的導數(不說不可導的情況)。

某一點的導數是什麼意思呢,就是這一點的變化率,定義大概是這樣的(數學符號不好寫):在某一點,在x的增量趨於0時,也就是x的變化很小很小很小時,y的增量與x的增量的比值,就是變化率。明顯,以x的增量趨於0來描述了這一點的變化(讓變化很小)。這個就是變化率的含義,簡單來說,導數就是變化率,描述了變化的情況。

換一個角度來說(只考慮變數值是實數的情況),先看看我的手繪圖(你給多少分?):

上圖,表達的是p1下一步(“附近”)的變化率,為了好畫線,找了一個很遠的p2點。你可以想象,當p1的下一步變化很小很小時(dx趨於0時),p2就會無限接近p1,而這個過程,直線p1p2的變化是怎麼樣的?想象一下,是不是p1p2會越來越像p1處的切線?

點p1的導數,從另一個角度來說,就是這個地方的切線斜率。可以想象,如果曲線上的所有點,都取它的切線,就可以逼近曲線。這種用導數來還原曲線(函式)的辦法,就叫積分。求導跟積分是互逆過程。

如果你還是不太明白,那知道一個概念就算了:變化、導數跟切線,是關聯的東西。

什麼是偏導數?

上面提到的損失函式是一個曲線,因為只有一個特徵變數。如果有多個特徵,那損失函式就不再是曲線,而是曲面(某點的切線有無數條)。曲面(多個自變數)時,不再叫導數,而叫某某變數的偏導數,只是為了明確是誰的變化率。而問題也在這裡,為了得到x的偏導數,就要固定其它自變數,而此時的偏導數就只是沿x方向的變化(不能同時考慮進其它方向),這樣就沒有任意方向了,沒有任意方向是個問題嗎?

舉個例子,假設你在山坡上,你要走到山谷的小湖中。如果每次移動你只能在x、y或z(平面與高度)中的一個方向移動(假設你總能移動哪怕是穿透),那你只能是“直上直下”、“直前直後”的,這個不是高效的走法。此時,為了形象,手繪圖再次出場:

圖中的虛線(實際上有無線),可能讓你更快地到達小湖洗腳,這個叫方向導數。

什麼是方向導數?

為了解決直前直後的偏導數的問題,引入另一個概念就是方向導數。方向導數就是任意方向的導數,可以想象,你所在的山坡的位置,有無數的方向導數,於是,哪一個方向導數(也就是變化率)是變化最大的?變化最大的方向在哪裡?這個大小跟方向都是可以求出來的。

為了標誌方向導數的最大值跟方向,引入了一個名字,叫梯度。

什麼是梯度

終於到我出場了,梯度是一個向量(有大小跟方向),梯度的值就是最大的變化率(方向導數的最大值),梯度的方向就是最大變化率的方向(取得最大方向導數的方向)。

所以,沿著梯度的反方向,就是下降最快的方向,就是最快到損失最低點的方向,而梯度下降演算法就利用了這個特徵。


梯度是一個向量,值是最大方向導數的值,方向是取得最大方向導數的方向。是不是很繞?是的,跟廢話一樣繞。簡單來說,梯度的反方向代表著最佳的前進方向,指引你快速到達損失最低點。

問題是,我不會計算梯度啊,怎麼辦?在應用的世界,這都不是問題,比如tensorflow會幫你計算梯度,你躺著就好。

但稍微理解一下操作總是要的吧。梯度下降法,在整體操作上,還是較容易理解的。可以參考這個圖(圖片來源於:https://developers.google.com/machine-learning/crash-course/reducing-loss/gradient-descent):

前面提過,走到最低點,一看方向,二看移動幅度。方向的問題用梯度解決了,那移動的幅度呢?這時引入一個概念,叫學習速率(learning_rate),也叫步長。移動的幅度,就是當前點的梯度值乘以學習速率(比如是0.001),再加上原梯度值。

如果學習速率很小,那總會走到損失的最低點,但訓練時間有可能很長。如果學習速率很大,那有可能總是跳過最低點而無法收斂(注意,不是說一出現跳過最低點就一定不能收斂,它可以左右擺動最終到達最低點,因為移動幅度是變化的,跟陡峭的程度有關)。

一般可以邊訓練邊觀察,尋找一個折中的學習速率值,這個跟樣本的數量、特徵複雜度等有關。對於學習速率的直觀感受,你可以在這個頁面操作一下:
https://developers.google.com/machine-learning/crash-course/fitter/graph

以上就介紹了怎麼調整引數。

最後,再重提一下損失曲線,上面說每一次迭代都要對所有樣本預測並計算損失,而實際上,“所有”並不是終極方案,如果有更優的方案呢,如果不必所有的樣本都計算一次呢(畢竟有時樣本是海量的)?這時,一些優化方案就出來了,比如隨機梯度下降(只使用一個樣本)、小批量隨機梯度下降(多一點樣本),這些就不細說了,誰用誰研究。

總結一下,本文介紹了模型訓練的迭代學習的原理。迭代學習的過程,主要是模型的計算引數被調整,進而觸發反覆的標籤預測(預測是為了算損失)、損失計算與模型引數調整,是一個自驅動的過程。在迭代的過程中,調整模型的引數是重要的一環,梯度下降演算法可以有效地調整模型引數,以達到最小的損失,從而使訓練收斂。


相關推薦

機器學習3機器進化-學習

之前介紹的簡單線性迴歸,就是一個迴歸模型,是一個可用於機器學習的模型。什麼意思呢?就是模型的狀態(引數集合)是可以進化的,只要合理訓練它,模型就能取得更好的預測狀態,所以說模型可用於機器學習。 要應用機器學習,一開始就要考慮選擇一個良好的模型(分類模型或迴歸模型),想清楚了,這步是很重要的,如果你選擇了一個不

機器學習機器學習中的幾個基本概念

前言 對於《統計學習方法》中遇到的一些問題,以及機器學習中的一些自己沒有理解透徹的問題,希望通過梳理總結能夠有更深入的理解。 在上一章最開始我們已經概括了統計學習方法的三要素,即模型、策略、演算法,這裡就不再詳述了。 本文討論總結了如下幾個概念:損失函式與風險

機器學習5機器學習的一個例項

大家都知道tensorflow(簡稱tf)是一個機器學習的框架,使用它就可以完成機器學習。那就用tf來演示一下怎麼做機器學習吧,這樣你就有一個具體的感受:原來是這樣的啊! 本文使用tensorflow做一次機器學習的演示。 但是,tensorflow的理解跟使用,是可以作為一個獨立的專題來講解的,這個我再補充

PYTHON設計模式學習3Singleton pattern

blog ora 參考 擁有 沒有 _屬性 ces cti ttr 參考了其他的博客:http://ghostfromheaven.iteye.com/blog/1562618 #-*- encoding=utf-8 -*- print ‘--------------

tcpdump 學習3MySQL Query

說明 server gen rollback 命令 復雜 pro 關於 col 在MySQL線上環境我們一般只打開了binary log,slow log,有時我們需要查看general log呢?因為該log記錄所有的請求,打開該日誌肯定給磁盤造成很大壓力,IO能力有所下

web前端學習3認識HTML基本標簽

鼠標 首頁 一份 格式 所在地 有著 同時 網上 今天 本章主旨:   介紹常用的文本相關標簽,如<h>,<p>,<a>;簡介常見的HTML標簽屬性,如title屬性,href屬性,id/class屬性等;重點掌握<a>標簽。

Spring學習3Spring概述轉載

效率 調度 jpa 源代碼 一個 維護 html www hiberna 1. Spring是什麽?   Spring是一個開源的輕量級Java SE(Java 標準版本)/Java EE(Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程序開發。   在面向對

Spring學習3IOC基礎轉載

目標 發生 由於 不同 擴展 通過 new 包括 control 一. IoC是什麽   Ioc—Inversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部

ADB 學習3adb uninstall 命令

一、前言         俗話說,有因就有果,有安裝肯定也是有解除安裝,在測試當中是必不可少的一個步驟,和 安裝 差不多,但是也是有不同的地方。 二、詳解         Ⅰ、當我們只有一臺裝置連線

robotframework 學習3 Excel檔案的操作

一、前言         上一篇部落格寫了一些使用RIDE來進行介面測試的一個簡單demo,在裡面我們可以發現傳輸的資料都是寫死在裡面,如果需要從外面傳輸就需要進行引數化。我這裡用的是excel來儲存需要傳輸的資料,那麼我就需要用rf來對excel進行

three.js學習3匯入threejs

1.在HTML中匯入: 2.用js中匯入: (1)當你的檔案中內建的有一些匯入工具像Webpack或Browserify,你可以用 var THREE = require("three"); var scene = THREE.Scene(); (2)使用ES6的語法形式(如果

tensorflow學習3初始化

一、隨機數生成函式 tf.truncated_normal(shape, mean, stddev) shape表示生成張量的維度,mean是均值,stddev是標準差。這個函式產生正太分佈(嚴格的說是高斯分佈),均值和標準差自己設定。 這是一個截斷的產生正太分佈的函式,就是說

C語言學習3陣列和指標

前言 上一篇部落格講了指標的用法,本章來講陣列。首先明確一點,陣列也是指標。 正文 1、陣列的幾種定義 int arr[5]; //不初始化 int arr[5] = {1,2,3,4,5}; //初始化 int arr[] = {1,2,3,

Numpy學習3將mnist資料檔案讀入到資料結構numpy陣列

''' 使用python解析二進位制檔案 ''' import numpy as np import struct def loadImageSet(filename): binfile = open(filename, 'rb') # 讀取二進位制檔案 buffers = bin

SpringMVC學習3使用@PathVariable對映請求引數

可以使用@PathVariable對映url中的佔位符到目標方法的引數中 ,佔位符的名字{xxx}需要和@PathVariable("xxx")中的名字相同 在之前HelloWorld的基礎上修改一下,示例一下: 修改一下java類 package springmvc;

Mondrian學習3整合到spring web專案中

    前面講了通過類似jdbc程式設計的方式來使用mondrian多維分析工具,顯然有很多弊端。    1.這種方式通過字串中的key-value把資料庫連線,模型檔案,資料庫驅動都寫死了。並且每次獲取一個連線都要getconnetion一次。    2.一般的java w

linux命令學習3pwd命令

Linux中用 pwd 命令來檢視”當前工作目錄“的完整路徑。 簡單得說,每當你在終端進行操作時,你都會有一個當前工作目錄。 在不太確定當前位置時,就會使用pwd來判定當前目錄在檔案系統內的確切位置。 1.命令格式: pwd [選項] 2.命令功能:

tensorflow學習3解讀mnist_experts例子,訓練儲存模型並tensorboard視覺化

前言 官網的mnist例子講解的很清楚了,要想深入理解這個網路結構到底幹了什麼,還是需要好好入門一下深度學習的基礎知識。好好看看Michael Nielsen大神寫的這本書:Neural Networks and Deep Learning,中文版下載地址:中

機器學習筆記3線性代數回顧

目錄 1)Matrices and vectors 2)Addition and scalar multiplication 3)Matrix-vector multiplication 4)Matrix-matrix multiplication 5)Matrix multip

機器學習儲備3似然函式例子解析

似然函式是個什麼函式,它的意義是什麼?它與概率相比,有什麼不同嗎? 1、似然函式 似然函式是一種關於統計模型中的引數的函式,表示模型引數中的似然性。 給定輸出 x 時,關於引數 θ 的似然函式 L(θ|x),在數值上它等於給定引數 θ 後變數 X 的概率: 這個是非常