05 反向传播
反向傳播
??上一篇博客介紹了從輸入 X 樣本開始,通過一組 www 參數(shù),得到了一個(gè)得分值,然后又將得分值經(jīng)過 y=exy = e^xy=ex 函數(shù)的變換和歸一化操作得到一個(gè)概率,然后又通過 y=?logxy = -logxy=?logx 函數(shù)求出了 Loss 值。有了 Loss 值之后,就可以進(jìn)行最優(yōu)化的操作。
??
??我們通常把從開始到得到 Loss 的過程稱為前向傳播。 通常神經(jīng)網(wǎng)絡(luò)是由 BP 算法求解的,那什么是 BP 算法呢?BP 算法就是說通過前向傳播求出 Loss 值,然后經(jīng)過一次反向傳播再次優(yōu)化這些權(quán)重參數(shù)(WWW)。
??
??其實(shí)神經(jīng)網(wǎng)絡(luò)可以由兩部分組成,一部分為前向傳播,另一部分就是反向傳播。那么這個(gè)反向傳播應(yīng)該怎樣更新這些權(quán)重參數(shù)呢?
??
??下面就舉個(gè)例子說明反向傳播。假設(shè)現(xiàn)在有三個(gè)樣本點(diǎn) x=?2x = -2x=?2,y=5y = 5y=5,z=?4z = -4z=?4,然后通過 f(x,y,z)=(x+y)zf(x, y, z) = (x + y)zf(x,y,z)=(x+y)z 得到值 -12。
??
??假設(shè)現(xiàn)在 -12 是我們求出的一個(gè)損失值,有了這個(gè)損失值之后,我想知道 xxx,yyy,zzz 分別對 fff 做了多大貢獻(xiàn)?我們可以想象一下,我們之前是要優(yōu)化 www,我們要算 www 和 LossLossLoss 之間的關(guān)系, 有些 www 可能會(huì)使得 LossLossLoss 值變大。比如說,現(xiàn)在有一個(gè) www 增大之后,LossLossLoss 值也增大,那么此時(shí)我們就需要將 www 值減小才能使得 LossLossLoss 盡可能小。但是如果另外一個(gè) www 增大之后,LossLossLoss 減小了,那么此時(shí)我們需要將 www 增大。那么我們現(xiàn)在就計(jì)算一下 xxx,yyy,zzz 這些權(quán)重參數(shù)對 fff 函數(shù)產(chǎn)生了多大影響。
??首先我們分析 f(x,y,z)=(x+y)zf(x, y, z) = (x + y)zf(x,y,z)=(x+y)z,第一步計(jì)算 x+yx + yx+y,在這里我們將指定一個(gè)額外的元素 qqq,使得 q=x+yq = x + yq=x+y,那么 f=q?zf = q*zf=q?z。那么現(xiàn)在就可以計(jì)算 zzz 對 fff 做了多大貢獻(xiàn),那么只需要計(jì)算 zzz 對 fff 的偏導(dǎo):
??
??偏導(dǎo)數(shù)等于 3 意味著如果說 zzz 增大一倍,那么 fff 就會(huì)增大 3 倍。但是現(xiàn)在我是想 fff 減小,所以 zzz 應(yīng)該往減小的方向去發(fā)展。那么接下來就計(jì)算 xxx 和 yyy 對 fff 做了多大貢獻(xiàn)。首先 xxx 和 yyy 經(jīng)過了 q=x+yq = x + yq=x+y 這樣的組合,所以要想求出 xxx 和 yyy,必須先求出 qqq 對 fff 產(chǎn)生了多大影響。
??f=q?zf = q*zf=q?z 那么 fff 對 qqq 的偏導(dǎo)數(shù)就是:
??偏導(dǎo)數(shù)等于 -4 意味著如果說 qqq 增大一倍,那么 fff 就會(huì)減小 4 倍,所以 qqq 應(yīng)該朝著增大的方向發(fā)展。而 q=x+yq = x + yq=x+y,那么要想算出 xxx 和 yyy 對 fff 的影響,就要先算出 xxx 和 yyy 對 qqq 的影響,那么就要分別算出 xxx 和 yyy 分別對 qqq 的偏導(dǎo)數(shù)。
??那么就可以理解為當(dāng) xxx 增大一倍,qqq 就增大一倍;yyy 增大一倍,qqq 也增大一倍。那么現(xiàn)在我算 xxx 對 fff 產(chǎn)生多大影響,這個(gè)時(shí)候在反向傳播當(dāng)中有一個(gè)鏈?zhǔn)椒▌t,鏈?zhǔn)椒▌t的意思就是假設(shè)要算 xxx 對最終結(jié)果做了多大貢獻(xiàn),那最終結(jié)果中間肯定有很多步,我們需要一步一步將梯度傳下來。比如在這個(gè)例子中,qqq 對 fff 做的貢獻(xiàn)是 -4,xxx 對 qqq 做的貢獻(xiàn)為 1,那么 xxx 對 fff 做的貢獻(xiàn)就是 -4 * 1 = -4,遵循鏈?zhǔn)椒▌t。也就是說 xxx 增大一倍,fff 就相應(yīng)減小 4 倍,所以 xxx 應(yīng)該向增大的方向發(fā)展。要求 yyy 對 fff 的貢獻(xiàn)同理,qqq 對 fff 做的貢獻(xiàn)是 -4,yyy 對 qqq 做的貢獻(xiàn)為 1,那么 yyy 對 fff 做的貢獻(xiàn)就是 -4 * 1 = -4,也就是說 yyy 增大一倍,fff 就相應(yīng)減小 4 倍,所以 yyy 也應(yīng)該向增大的方向發(fā)展。
??下面這張圖就很明顯說明了反向傳播的過程。我們要想算出 xxx 和 yyy 對 LLL 的梯度,首先得先算出 zzz 對 LLL 的梯度,再算出 xxx 和 yyy 分別對 zzz 的梯度。不能用一步直接求出 xxx 和 yyy 對 zzz 的導(dǎo)數(shù),首先第一步肯定是通過 LLL 傳到 zzz,再由 zzz 傳到 xxx 和 yyy,這就是反向傳播的過程。
??
總結(jié)
- 上一篇: 如何把程序员从久坐颈椎病中拯救出来?我为
- 下一篇: QWT--选取图元