從線性迴歸案例理解深度學習思想
我不是主攻人工智慧、深度學習方向,但是作為計算機相關領域的學習者,如果不瞭解下,總覺得已經跟不上時代了,況且,人工智慧真的是大勢所趨,學會了,能夠嘗試用在不同領域。
本文將使用迴歸的思想來求解二元一次方程的最佳解,理解深度學習的根本思想。
假設,對於二元一次方程:
y = a * x + b
假設我們能夠採集到一組資料(x,y),這些值都是滿足以上等式的,但是,現實生活中往往不能這樣順利(如果採集的值是精確值,直接列方程組就能求出a和b),我們採集到的每組(x,y)都存在一定偏差,所以,現實中採集到的資料應表示為:
y = a * x + b + r
r表示偏差,這個時候,我們需要通過這一組資料,來找到一組a和b,使得 y = a * x + b 和理想的情況越接近。
為了方便表示,將r表示為:
r = y - (a * x +b)
因為這個值可能為負數,所以用r的平方來表示這個偏差,記為:
loss = [ y - (a * x + b)] 2
這裡用loss記,實際上就理解為模型訓練過程中的“損失”,我們需要找到到一組a和b,使得loss最小。
在數學中,我們會用到極限的思想求解最小值,但是,在深度學習中,是如何找到這個最小loss的呢?
這裡就需要提到梯度下降的思想(這些內容在 《計算方法》 這門學科中有詳細的說明),通俗地理解,在本文的二元一次方程中,就是初始化一個a和b,然後進行一定次數的迭代,在每次迭代中,調整a和b的值。
將loss表示的函式分別對a和b求偏導數:
dei a = 2 * [ y - ( a * x + b ) ] * x
dei b = 2 * [ y - ( a * x + b ) ]
我們每次調整a和b的值使用如下方法:
new a = a - dei a * learn_rate
new b = b - dei b * learn_rate
實際上,在每輪迭代中,我們將會用收集到的每組資料都來計算dei a和dei b,最終使用平均值,表示經過這一輪,引數a和b需要被調整的大小。
但是,我們發現,調整引數的時候,dei a和dei b還分別乘以了一個learn_rate,這個learn_rate在深度學習模型訓練中叫學習率,一般取一個比較小的值,0.001、0.01等,可以通過嘗試找到最優的值。如果不乘以learn_rate,對a來說,每次需要調整dei a,這個值是很大的,而且會出現不能收斂的情況:
從上圖中可以看到,對同一個loss函式,如果使用0.05的learn_rate,會導致loss在最小值附近波動,不能找到最小值,而使用0.005的學習率,每次調整的範圍更小,且能正確地找到loss的最小值。
通過一定次數的迭代,我們就能找到一組a和b的值,這組a、b能夠使得loss儘可能小,甚至為0,我們近似認為這個方程就是理想情況下的方程:
y = a * x + b
這時,如果給出一個值a1,就可以根據上式得到一個y1值,這就是我們所說的預測值。
這個例子雖然比較簡單,但是包含了深度學習的精髓思想。無論多大的網路模型、資料量,實際上都是對一組引數不斷地進行調整,使得在這組引數的情況下,所得到的一個函式關係,能夠讓loss的值儘可能小(當然,這種標準可以根據不同需求進行修改),換句話說,就是找到一組引數,使得一個關係式儘可能趨近給定的一組資料中的每個對映關係(資料和標籤的對映),然後再根據這個關係式,對新給定的值,給出相應計算結果,這就是就是預測值。
附,本文涉及的程式碼和資料:
import numpy as np
'''
y = a*x+b + noise
loss = (a*x+b - y)**2
die a = 2(a*x+b-y)*x
die b = 2(a*x+b-y)
'''
# 計算損失loss,神經網路模型訓練過程中,一般會在每一輪都輸出一次,檢視訓練效果
def get_loss(a, b, points):
sum = 0
for i in points:
x = i[0]
y = i[1]
t = (a * x + b - y) ** 2
sum = sum + t
# 因為有多組資料,這裡求平均值,表示當前a,b情況下,表示式和這組資料的平均偏差
average_loss = sum / float(len(points))
return average_loss
# 求梯度,調整a,b的值,這是引數能夠被“訓練”的關鍵部分
def step_grad(a, b, learn_rate, points):
da_sum, db_sum = 0, 0
for i in points:
x = i[0]
y = i[1]
da_sum = da_sum + 2 * (a * x + b - y) * x
db_sum = db_sum + 2 * (a * x + b - y)
num = len(points)
da = da_sum / float(num)
db = db_sum / float(num)
# 返回新的a,b
return a - learn_rate * da, b - learn_rate * db
# totalnum表示總共迭代次數
def loop(a, b, learn_rate, points, totalnum):
for i in range(0, totalnum):
# 每次迭代都會得到一組新的a,b,將其作為下一次迭代的初始值
a, b = step_grad(a, b, learn_rate, points)
loss = get_loss(a, b, points)
print("after ", totalnum, "times, loss: ", loss)
print("a=", a, " b=", b)
if __name__ == '__main__':
points = np.genfromtxt("data.csv", delimiter=",")
# a,b初始化為0,learn_rate設定為0.0001,迭代10000次,points理解為實際情況中,採集到的資料
loop(0, 0, 0.0001, points, 10000)
csv資料,網盤連結: https://pan.baidu.com/s/1Sknt8dV7kA81IE2ij6bkYw 提取碼: exf2
訓練結果:
相關推薦
從線性迴歸案例理解深度學習思想
我不是主攻人工智慧、深度學習方向,但是作為計算機相關領域的學習者,如果不瞭解下,總覺得已經跟不上時代了,況且,人工智慧真的是大勢所趨,學會了,能夠嘗試用在不同領域。 本文將使用迴歸的思想來求解二元一次方程的最佳解,理解深度學習的根本思想。 假設,對於二元一次方程: y = a * x + b 假設我們能夠採集
《精通資料科學:從線性迴歸到深度學習》筆記
《精通資料科學:從線性迴歸到深度學習》 —— Harrytsz 第 1 章 資料科學概述 The purpose of computing is insight, not numbers. —— Richard Hamming (計算的目的不在於數字,而
精通資料科學:從線性迴歸到深度學習-學習筆記
由於前兩章節是基礎,就不在描述了。 第三章,數學基礎: 3.1矩陣和向量空間 標量、向量與矩陣 特殊矩陣 矩陣運算 程式碼實現 向量空間 3.2 概率:量
深度學習系列(1)——從線性迴歸說起
為什麼先說線性迴歸 本文適合入門級同學,老司機繞行。 吳恩達老師的機器學習課程,介紹的第一個模型就是線性迴歸模型。機器學習(尤其是監督學習),主要圍繞分類和迴歸兩類問題展開,而線性迴歸模型作為最簡單的迴歸模型,與大多數監督學習演算法具有相同的建模思路,包括建
從極大似然估計的角度理解深度學習中loss函式
從極大似然估計的角度理解深度學習中loss函式 為了理解這一概念,首先回顧下最大似然估計的概念: 最大似然估計常用於利用已知的樣本結果,反推最有可能導致這一結果產生的引數值,往往模型結果已經確定,用於反推模型中的引數.即在引數空間中選擇最有可能導致樣本結果發生的引數.因為結果已知,則某一引數使得結果產生的概率
機器學習——從線性迴歸到邏輯迴歸【附詳細推導和程式碼】
本文始發於個人公眾號:TechFlow,原創不易,求個關注 在之前的文章當中,我們推導了線性迴歸的公式,線性迴歸本質是線性函式,模型的原理不難,核心是求解模型引數的過程。通過對線性迴歸的推導和學習,我們基本上了解了機器學習模型學習的過程,這是機器學習的精髓,要比單個模型的原理重要得多。 新關注和有所遺忘的同
分享《深度學習與計算機視覺算法原理框架應用》《大數據架構詳解從數據獲取到深度學習》PDF數據集
書簽 部分 https log pdf 深入 -s 更多 實用 下載:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w 更多資料分享:http://blog.51cto.com/3215120 《深度學習與計算機視覺 算法原理
理解深度學習:與神經網路相似的網路-自編碼器(上)
歡迎訪問Oldpan部落格,分享人工智慧有趣訊息,持續醞釀深度學習質量文。 自編碼器是什麼,自編碼器是個神奇的東西,可以提取資料中的深層次的特徵。例如我們輸入影象,自編碼器可以將這個影象上“人臉”的特徵進行提取(編碼過程),這個特徵就儲存為自編碼器的潛變數,例如這張人
AI應用開發基礎傻瓜書系列4-用線性迴歸來理解神經網路的訓練過程
下面我們舉一個簡單的線性迴歸的例子來說明實際的反向傳播和梯度下降的過程。完全看懂此文後,會對理解後續的文章有很大的幫助。 為什麼要用線性迴歸舉例呢?因為\(y = wx+b\) (其中,y,w,x,b都是標量)這個函式的形式和神經網路中的\(Y = WX + B\)(其中,Y,W,X,B等都是矩陣)非常近似,
動圖形象理解深度學習卷積
動圖形象理解深度學習卷積 https://www.toutiao.com/a6615770434111537667/ 理解卷積神經網路CNN,特別是對第一次接觸卷積神經網路的人來說,經常會對諸如卷積核、濾波器、通道等概念和他們的堆疊
一文帶你理解深度學習的侷限性
深度學習:幾何檢視 深度學習最令人驚訝的特點便是極易上手。十年以前,沒有人可以猜得到經過梯度下降法訓練過的簡單引數模型可以在機器感知問題上實現如此驚人的結果。現在,事實證明,研究者所需要做的只是使用足夠大的梯度下降素材來訓練引數模型。正如 Feynman 曾經描述宇
理解深度學習中的卷積
譯自Tim Dettmers的Understanding Convolution in Deep Learning。有太多的公開課、教程在反覆傳頌卷積神經網路的好,卻都沒有講什麼是“卷積”,似乎預設所有讀者都有相關基礎。這篇外文既友好又深入,所以翻譯了過來。文章高階部分
如何理解深度學習中的卷積?
原文地址: http://www.yangqiu.cn/aicapital/2382000.html 譯自Tim Dettmers的Understanding Convolution in Deep Learning。有太多的公開課、教程在反覆傳頌卷積神經網路的好,卻
理解深度學習需要重新思考泛化
這篇文章來自ICLR2017 best paper,是一片十分有爭議的文章,看完之後在小組會上跟大家分享了這篇文章,最終經過一系列討論,結合種種實驗得出結論,我們認為資料對於泛化效能來說是十分重要的,因為對於實驗中的資料來說,我們可以發現在真實資料上的實驗結果以及泛化結果相
從特徵描述子到深度學習:計算機視覺的20年曆程 From feature descriptors to deep learning: 20 years of computer vision
We all know that deep convolutional neural networks have produced some stellar results on object detection and recognition benchmarks in the past two year
Keras TensorFlow教程:如何從零開發一個複雜深度學習模型
Keras 是提供一些高可用的 Python API ,能幫助你快速的構建和訓練自己的深度學習模型,它的後端是 TensorFlow 或者 Theano 。本文假設你已經熟悉了 TensorFlow 和卷積神經網路,如果,你還沒有熟悉,那麼可以先看看這個10分鐘入門 TensorFlow 教程和卷積
[深度學習大講堂]從NNVM看2016年深度學習框架發展趨勢
本文為微信公眾號[深度學習大講堂]特約稿,轉載請註明出處 虛擬框架殺入 從發現問題到解決問題 半年前的這時候,暑假,我在SIAT MMLAB實習。 看著同事一會兒跑Torch,一會兒跑MXNet,一會兒跑Theano。 SIAT的伺服器一般是不給sudo許可權的,我看著同事掙扎在編譯這一坨框架的
直觀理解深度學習的卷積操作,超讚!
翻譯 | 於志鵬 趙朋飛 校對 | 翟修川 整理 | 凡江 轉自 | AI研習社 近幾年隨著功能強大的深度學習框架的出現,在深度學習模型中搭建卷積神經網路變得十分容易,甚至只需要一行程式碼就可以完成。 但是理解卷積,特別是對第一次接
幹貨 | 深入理解深度學習中的激活函數
神經網絡學習 目標 tps 數值 函數表 我們 傳播 多少 當我 理解深度學習中的激活函數 在這個文章中,我們將會了解幾種不同的激活函數,同時也會了解到哪個激活函數優於其他的激活函數,以及各個激活函數的優缺點。 1. 什麽是激活函數? 生物神經網絡是人工神經網絡的起源。然而
理解深度學習:神經網路的雙胞胎兄弟-自編碼器(上)
# 前言 *本篇文章可作為<利用變分自編碼器實現深度換臉(DeepFake)>的知識鋪墊。* 自編碼器是什麼,自編碼器是個神奇的東西,可以提取資料中的深層次的特徵。 例如我們輸入影象,自編碼器可以將這個影象上“人臉”的特徵進行提取(編碼過程),這個特徵就儲存為自編碼器的潛變數,例如這張人臉的