链接:https://www.zhihu.com/question/29648549/answer/158728039
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
wake-sleep algorithm的fine-tuning算法在Hinton06年的那篇论文最后是有伪码的,Hinton使用的标准的DBN自画图如下:
<img src="https://i-blog.csdnimg.cn/blog_migrate/d4b8faeaccf69d721436364cbd8bde96.png" data-rawwidth="596" data-rawheight="716" class="origin_image zh-lightbox-thumb" width="596" data-original="https://pic1.zhimg.com/v2-3c5c2ef7c433c3221d5afd9c57b1c028_r.png">
i)wake-phase:(认知阶段)
先用认知阶段的参数计算每一层的认知阶段的状态(从下往上推...)
wakehidprobs = sigmoid(Wvishid * vis + brechid)
wakehidstates = wakehidprobs>rand(1, numhid)
wakepenprobs = sigmoid(Whidpen * wakehidstates + brecpen)
wakepenstates = wakehidstates > rand(1, numpen)
ii)再计算最上层拿来做先验的玻尔兹曼机的状态(最上两层跳啊跳~)
waketopprobs = sigmoid(Wpentop * wakepenstates + Wlabtop * targets + btop)
waketopstates = waketopprobs > rand(1, numtop)
然后再接的Contrastive Divergence...这里我就省略
iii)sleep-phase:(生成阶段)
最后用生成阶段的参数计算每一层的生成阶段的状态(从上往下推...)
sleeppenstates = equpenstates
sleephidprobs = sigmoid(Wpenhid * sleeppenstates + bgenhid)
sleephidstates = sleephidprobs > rand(1, numhid)
sleepvisprobs = sigmoid(Whidvis * sleephidstates + bgenvis)
以上状态就得到了,接下来就是更新参数了。
i)认知阶段的状态来更新生成阶段的权重:
再用每一层的认知状态来更新生成参数,使得生成模型能够往认知上面靠
(更新权重的公式也在上面那篇06年的论文中有推导的...)
pvisprobs = sigmoid(Whidvis * wakehidstates + bgenvis)
Whidvis <- Whidvis + lr * wakehidstates.T * (vis - pvisprobs)
phidprobs = sigmoid(Wpenhid *wakepenstates + bgenhid )
Wpenhid <- Wpenhid + lr * wakepenstates.T * (wakehidstates - phidprobs)
ii)玻尔兹曼机直接利用Contrastive Divergence的结论来更新参数就好~
iii)生成阶段的状态来更新认知阶段的权重:
psleeppenstates = sigmoid(Whidpen * sleephidstates + brecpen)
Whidpen <- Whidpen + lr * sleephidstates.T * (sleeppenstates - psleeppenstates)
psleephidstates = sigmoid(Wvishid * sleepvisstates + brechid)
Wvishid <- Wvishid + lr * sleepvisstates.T(sleephidstates - psleephidstates)
参考文献:
Hinton G E, Osindero S, Teh Y W, A fast learning algorithm for deep belief nets[J], Neural computation, 2006, 18(7): 1527-1554