迴圈神經網路中很容易出現梯度衰減或**。由於是迴圈計算,在進行反向傳播的時候,梯度會傳播很多次。
當傳播過程中有大多數導數 > 1時,最終的梯度會出現∞
\infty
∞,即所謂梯度**;當大多數導數 < 1時,最終的梯度會 →
0\rightarrow0
→0,即所謂梯度消失。
對此,有一種可行的做法,稱為梯度裁剪。假設將所有模型引數梯度的元素拼接成乙個向量g
\boldsymbol g
g,並設裁剪的閾值是θ
\theta
θ。則定義裁剪後的梯度為
m in
(θ∥g
∥,1)
gmin(\frac , 1)\boldsymbol g
min(∥g
∥θ,
1)g
即:當所求出的梯度範數∥g∥
\parallel \boldsymbol g \parallel
∥g∥ > 我們所能接受的閾值θ
\theta
θ時,就將其縮小θ∥g
∥\frac
∥g∥θ
倍;否則,就不變。
**實現如下:
'''
params: 模型的所有引數
theta: 閾值
ctx: cpu or gpu
'''def
grad_clipping
(params, theta, ctx)
:# 求範數
norm = nd.array([0
], ctx)
for param in params:
norm +=
(param.grad **2)
.sum()
norm = norm.sqrt(
).asscalar(
)if norm > theta:
for param in params:
param.grad[:]
*= theta / norm # 梯度縮小
對於語言模型的評價,通常採用困惑度(perplexity)。困惑度定義為:交叉熵損失函式做指數運算後的值。特別地, 神經網路 梯度下降
優化問題newton s method 牛頓法 least squares method最小二乘法 gradient descent梯度下降法 當 cost對w的梯度最小 斜率最小 時,誤差最小。我們從圖中可以看出,cost 誤差最小的時候正是這條 cost 曲線最低的地方,不過在藍點的 w 卻不知...
迴圈神經網路
原文 迴圈神經網路也可以畫成下面這個樣子 對於語言模型來說,很多時候光看前面的詞是不夠的,比如下面這句話 我的手機壞了,我打算 一部新手機。可以想象,如果我們只看橫線前面的詞,手機壞了,那麼我是打算修一修?換一部新的?還是大哭一場?這些都是無法確定的。但如果我們也看到了橫線後面的詞是 一部新手機 那...
迴圈神經網路
原文 迴圈神經網路也可以畫成下面這個樣子 對於語言模型來說,很多時候光看前面的詞是不夠的,比如下面這句話 我的手機壞了,我打算 一部新手機。可以想象,如果我們只看橫線前面的詞,手機壞了,那麼我是打算修一修?換一部新的?還是大哭一場?這些都是無法確定的。但如果我們也看到了橫線後面的詞是 一部新手機 那...