一文看懂計算機神經網絡與梯度下降

1. 計算機神經網絡與神經元

要理解神經網絡中的梯度下降算法,首先我們必須清楚神經元的定義。如下圖所示,每一個神經元可以由關系式y=f(∑i=1nwixi+b)y = f(\sum_{i=1}^nw_ix_i + b)y=f(i=1n?wi?xi?+b)來描述,其中X=[x1,x2,...,xn]X = [x_1,x_2,...,x_n]X=[x1?,x2?,...,xn?]就是N維的輸入信號,W=[w1,w2,...,wn]W =[w_1,w_2,...,w_n]W=[w1?,w2?,...,wn?]是與輸入向量一一對應的n維權重,bbb bias 偏斜,yyy對應該神經元的輸出,fff函數稱為激勵函數,例如sigmoid函數,softmax函數等等。

那么一個神經網絡是如何進行學習的呢?以一個神經元為例,在一組輸入信號XXX經過該神經元后,我們得到了一個輸出信號稱之為yetoiley_{etoile}yetoile?,而訓練集中給出的實際輸出例如為yyy,那么顯而易見地,想要提高正確率,即正確地學習對于一組輸入應該獲得的輸出yyy,一個神經元所做的計算,就是一個最優化(最小化)問題,通過改變權重WWW來最小化損失(誤差) l(y,yetoile)l(y,y_{etoile})l(y,yetoile?)。當然,這個誤差的定義可以根據問題的不同有所區別,例如簡單的向量L1,L2距離,MSE均方誤差。對于整個訓練集而言,當然不止包含了一組輸入輸出。因此整體而言,誤差Loss Function L(W)=1N∑t=1Kl(yt,ytetoile)L(W) = \frac{1} {N}\sum_{t=1}^{K}l(y_t,y_{t_{etoile}})L(W)=N1?t=1K?l(yt?,ytetoile??) 是所有K組訓練數據誤差的總和的平均數。

我們已經知道了,Loss Function損失函數與神經元的權重息息相關,神經元要做的計算,就是找到能最小化該損失函數的權重WWW。優化的算法紛繁多樣,使用的較為廣泛的就是梯度下降gradientdescentgradient\space\space descentgradient??descent 及其衍生算法SGD隨機梯度下降,BGD批量梯度下降。

在這里插入圖片描述

2. 梯度下降算法 gradientdescentgradient\space\space descentgradient??descent

梯度下降算法,一言以蔽之,就是沿著梯度下降的方向不斷迭代,最終逼近函數最小值的優化方法。如下圖所示,在最小化Loss Function損失函數的過程中,權重總是沿著損失函數梯度下降的方向變化,即wi=wi?λ?L∣wiw_i = w_i - \lambda\nabla L|_{w_i}wi?=wi??λ?Lwi??,其中λ\lambdaλ為學習率。當損失函數的梯度接近0時,可以終止迭代。大致理解了梯度下降算法的原理,接下我們看看在優化神經元的過程中,梯度下降算法是如何實現的。

在這里插入圖片描述

3. backpropagation 反向傳播算法

通過上一個部分,我們理解了使權重沿著Loss的梯度下降方向迭代,可以最終最小化損失函數。這個過程中,權重的更新wi=wi?λ?L∣wiw_i = w_i - \lambda\nabla L|_{w_i}wi?=wi??λ?Lwi??取決于損失函數的梯度。計算該梯度的最常用方法,就是反向傳播算法。反向傳播算法其實際原理類似于復合函數導數。我們通過鏈式法則,可以將所需求的梯度分割成子變量的梯度的乘積。
以單個神經元的神經網絡的優化為例:
yetoile=f(∑i=1nwixi+b)y_{etoile} = f(\sum_{i=1}^nw_ix_i + b)yetoile?=f(i=1n?wi?xi?+b)

ei=wixie_i = w_ix_iei?=wi?xi?,

v=∑iei+θv=\sum_ie_i+ \thetav=i?ei?+θ

默認使用sigmoid激勵函數:

yetoile=σ(v)y_{etoile} = \sigma(v)\space\spaceyetoile?=σ(v)?? 經過激勵函數后的輸出

σ(v)=11+e?v\sigma(v) = \frac{1}{1+e^{-v}}\space\spaceσ(v)=1+e?v1??? sigmoid函數

?=yetoile?y\epsilon = y_{etoile} - y\space\space?=yetoile??y?? yetoiley_{etoile}yetoile?與實際值yyy的誤差

L=?2L = \epsilon^2L=?2

使用鏈式法則我們不難得到 :
?L?wi=?L?ei?ei?wiwhere?ei?wi=xi\frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial e_i}\frac{\partial e_i}{\partial w_i} \space\space where \space\frac{\partial e_i}{\partial w_i} = x_i ?wi??L?=?ei??L??wi??ei????where??wi??ei??=xi?

?L?ei=?L?v?v?eiwhere?v?ei=1\frac{\partial L}{\partial e_i} = \frac{\partial L}{\partial v}\frac{\partial v}{\partial e_i} \space\space where \space\frac{\partial v}{\partial e_i} =1 ?ei??L?=?v?L??ei??v???where??ei??v?=1

?L?v=?L?yetoile?yetoile?vwhere?yetoile?v=σ′(v)=e?v(1+e?v)2\frac{\partial L}{\partial v} = \frac{\partial L}{\partial y_{etoile}}\frac{\partial y_{etoile}}{\partial v} \space\space where \space\frac{\partial y_{etoile}}{\partial v} =\sigma'(v) = \frac{e^{-v}}{(1+e^{-v})^2}?v?L?=?yetoile??L??v?yetoile????where??v?yetoile??=σ(v)=(1+e?v)2e?v?

?L?yetoile=?L?????yetoilewhere???yetoile=1\frac{\partial L}{\partial y_{etoile}} = \frac{\partial L}{\partial \epsilon}\frac{\partial \epsilon}{\partial y_{etoile}} \space\space where \space\frac{\partial \epsilon}{\partial y_{etoile}} =1 ?yetoile??L?=???L??yetoile??????where??yetoile????=1

最后,?L??=2?\frac{\partial L}{\partial \epsilon} = 2\epsilon???L?=2?

通過鏈式法則,我們將復雜的復合函數的梯度拆解為一個個基礎的梯度,他們的乘積就是我們需要的損失函數Loss Function關于權重的梯度:
?L∣wi=2(?)σ′(v)xi\nabla L|_{w_i} = 2(\epsilon)\sigma'(v)x_i?Lwi??=2(?)σ(v)xi?

首先對于每個訓練集中的數據XXX,以及對應的當前權重WWW,我們首先通過正向傳播,計算出各個關鍵值并儲存在內存中。
在這里插入圖片描述
如下所示,通過正向傳播以及各個變量之間的數值關系,我們可以很簡單地計算出每次迭代各個變量對應的值。
在這里插入圖片描述
接著就是反向傳播計算梯度的過程了,如下圖所示,例如我們有?L??=2?=?1.37?2=?2.75\frac{\partial L}{\partial \epsilon} = 2\epsilon = -1.37 * 2 = -2.75???L?=2?=?1.37?2=?2.75
又有
???yetoile=1\frac{\partial \epsilon}{\partial y_{etoile}} =1?yetoile????=1
因此
?L?yetoile=?L?????yetoile=?2.75\frac{\partial L}{\partial y_{etoile}} = \frac{\partial L}{\partial \epsilon}\frac{\partial \epsilon}{\partial y_{etoile}} = -2.75 ?yetoile??L?=???L??yetoile????=?2.75


依此類推,我們不難通過鏈式法則,一步一步反向傳播,直到計算出我們最終需求的梯度值: ?L?wi\frac{\partial L}{\partial w_i}?wi??L?在這里插入圖片描述
理解了梯度下降算法在訓練神經元過程中的應用,以及反向傳播算法如何計算出復合梯度的過程,接下來分享一個Tensorflow模塊中非常好用的計算梯度的類,這大大簡化了我們計算反向傳播的過程。

4. Tensorflow GradientTape

用幾個簡單的例子介紹一下功能強大的GradientTape類,可以幫助我們在深度學習中簡便地計算函數的梯度。

import tensorflow as tf
with tf.GradientTape(watch_accessed_variables=True) as t:x = tf.Variable(3.0)y = x ** 2# t.watch(x)dy_dx = t.gradient(y,x)print(type(dy_dx))print(dy_dx.numpy())print(dy_dx)

上述代碼計算了 y=x2y = x^2y=x2這個函數在x=x=x=
輸出結果如下 :
在這里插入圖片描述
Tensorflow庫中的GradientTape類使用簡單,其中輸入輸出都推薦定義為張量tensor的形式,即可訓練的變量形式。GradientTape類中的watch_accessed_variables參數決定了類是否會自動觀測保存可訓練的變量,當這個參數值為False時,我們可以使用 t.watch()方法指定類觀察的具體變量。

如下例子,調用t.gradient()方法時,變量也可以是高維的tensor。

w = tf.Variable(tf.random.normal((3,2)),name='w')
b = tf.Variable(tf.zeros(2,dtype=tf.float32),name='b')
x = [[1.,2.,3.]]with tf.GradientTape() as tape:y = x @ w + bloss = tf.reduce_mean(y**2)# 可以用張量的形式同時計算多個變量tensor對應的梯度[dl_dw, dl_db] = tape.gradient(loss,[w,b])print(dl_dw)print(dl_db)

輸出結果如下:
在這里插入圖片描述
以我們在上一部分做的反向傳播算法為例 :

with tf.GradientTape() as tape:W = tf.Variable([[-1.,-1.5]])X = tf.Variable([[-3.],[2.]])thelta = tf.Variable(0.5,dtype=tf.float32)y_etoile = tf.sigmoid(W @ X + thelta)y = tf.Variable(2,dtype=tf.float32)loss = (y_etoile - y) ** 2(dl_dx, dl_dw, dl_dthe) = tape.gradient(loss,[X,W,thelta])print(dl_dw)

輸出結果如下:

可以看到,我們使用tensorflow計算出的梯度?L?wi\frac{\partial L}{\partial w_i}?wi??L?與使用反向傳播算法的計算結果是一致的。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386860.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vs2015web項目無法加載64位c++的dll,提示試圖加載不正確的格式

vs2015無法加載64位c的dll,提示試圖加載不正確的格式! 開始用winform引用64位的c的dll,在項目的屬性設置生成里面選擇any cpu或者x64都可以成功! 但在web項目和接口里面運行就提示試圖加載不正確的格式,想辦法找了一天也沒處理掉&…

使用Rancher搭建K8S測試環境

環境準備(4臺主機,Ubuntu16.04Docker1.12.6 SSH): rancher1 192.168.3.160 只做管理節點 node1 192.168.3.161 K8S的節點1 node2 192.168.3.162 K8S的節點2 node3 192.168.3.163 K8S的節點3 此時如…

Anaconda安裝tensorflow報錯問題解決方法

最近脫離了googlecolab想使用本地的anaconda進行機器學習課題的演練,在安裝tensorflow時報錯 : UnsatisfiableError: The following specifications were found。下面給出解決方法。 發現實際原因是由于anaconda的python環境,當前版本的tensorflow只能適…

5.07—018—周二

今日所學內容 一、模塊 二、遞歸刪除的思路 三、案例:跨文件夾移動文件 四、案例 遞歸遍歷打印目標路徑中所有的txt文件 五、項目開放周期 一、模塊 1、與時間相關的模塊 1)time :時間 時間戳(timestamp):time.time()  延遲線程…

機器學習模型中step與epoch,batch_size之間的關系

本文主要談談自己對step,epoch,batch_size這幾個常見參數的理解。 最近在調試模型的時候,發現在使用keras.optimizer.adam時,模型在添加了新的一層2D卷積層后難以收斂,在不調整初始權重矩陣的情況下,想通過…

yml的mybatis的sql查看

yml的mybatis的sql查看 控制臺輸出結果:

Debian 安裝 yum

sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install yum轉載于:https://www.cnblogs.com/baiqian/p/10840169.html

unity如何讓canvas總是顯示在所有層的最上方?

由于unity中的圖層都是從上至下渲染的,那么在渲染的過程中,只需要將canvas所在的UI層的渲染優先級order排在其他層之后,就可以保證UI畫面總是最后加載出來的了。 在canvas的inspector中修改order in layer 或者 sorting layer都可以實現這一…

FZU - 2037 -Maximum Value Problem(規律題)

Let’s start with a very classical problem. Given an array a[1…n] of positive numbers, if the value of each element in the array is distinct, how to find the maximum element in this array? You may write down the following pseudo code to solve this proble…

解決Feign接口調用有時候不好用的分析思路

很多架構師為了鑒權,會把controller帶過來的header信息一股腦的利用feign的攔截器帶入RequestTemplate,然后方便feign接口鑒權。這時候可能會帶入其他的header信息,比如content-type,而有的feign接口是對特定對header信息有要求的…

關于同時可用git命令clone和TortoiseGit拉取代碼不需要密碼

工作需要在windows7下使用git分布式版本控制系統,需要同時可以在git命令行模式或TortoiseGit拉取代碼而不需要每次輸入密碼。 這時候需要同時安裝git和TortoiseGit。 git使用命令ssh-keygen -C “郵箱地址” -t rsa產生的密鑰在TortoiseGit中不能用。TortoiseGit 使…

交叉驗證 cross validation 與 K-fold Cross Validation K折疊驗證

交叉驗證,cross validation是機器學習中非常常見的驗證模型魯棒性的方法。其最主要原理是將數據集的一部分分離出來作為驗證集,剩余的用于模型的訓練,稱為訓練集。模型通過訓練集來最優化其內部參數權重,再在驗證集上檢驗其表現。…

這個太有意思了,程序員可以消遣娛樂

/***        ┏┓ ┏┓ *       ┏┛┻━━━━━━━┛┻┓ *       ┃       ┃*       ┃   ━   ┃ *       █████━█████ ┃*       ┃       ┃ *       ┃   ┻   ┃* …

第十一周總結

這個作業屬于那個課程 C語言程序設計II 這個作業要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3203 我在這個課程的目標是 理解與使用遞歸函數。 參考文獻 基礎題 2-1 宏定義“#define DIV(a, b) a/b”,經DIV(x …

softmax函數與交叉熵損失函數

本文主要介紹了當前機器學習模型中廣泛應用的交叉熵損失函數與softmax激勵函數。 這個損失函數主要應用于多分類問題,用于衡量預測值與實際值之間的相似程度。 交叉熵損失函數定義如下: LCE(y^,y?)?∑i1Nclassesyi?log(yi^)L_{CE}(\hat{y}, y^*) - \sum_{i1}^…

vue配置git的子模塊

在vue的模塊需要調用許多公共組件,在公共組件之后會需要不斷的更新以及分組做,這時候可以利用git的方式更新組件所在位置 [submodule "src/component/common"] path src/component/common urlgit111.111.111.111:projectname/web-common-…

unity如何讓物體與特定物體之間不發生碰撞

unity中我們普遍使用的是碰撞器來實現各個物體的碰撞體積,例如Box collider, Sphere Collider。 在實現游戲的過程中,如果不想要物體與特定物體產生碰撞,或反之,只想讓碰撞發生在特定物體之間時,我們就需要配置layer …

jenkins的JAVA簡單順序配置git倉庫

后臺Java的發布配置 1、從源碼管理下載項目內容 2、構建觸發器 3 、構建下環境 4、構建后處理

SQLyog連接數據庫報錯plugin caching_sha2_password could not be loaded

打開cmd:mysql -uroot -p 進入mysql依次執行下面語句 ALTER USER rootlocalhost IDENTIFIED BY password PASSWORD EXPIRE NEVER; #修改加密規則 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; #更新一下用戶的密碼 FLUSH PRIVI…

unity導入素材時材質丟失素材變成粉紅色的解決方法

有很多時候,當我們通過unity asset store或者blender等等外源導入素材時,會出現材質缺失的bug,如下圖所示 : 一個很可能的原因,是由于unity本身管線在每個版本的更新過程中,材質的渲染編碼發生了改變。由于這種原因引…