随时间反向传播(backpropagation through time)
/ bak-prop-uh-GAY-shun throo tym /
随时间反向传播,是循环神经网络——那种一步一步读句子、股价之类序列的网络——从自己的错误中学习的方式。循环网络在每一个时间步都重复使用同一套权重,一边走一边把一份记忆向前带。诀窍在于在脑中把这个循环「展开」成一条长链,每个时间步对应网络的一个副本,再沿着整条链往回跑一遍普通的反向传播。
具体来说,网络先把序列向前处理一遍,在末尾(或每一步)产出一个输出和一个损失。然后误差不仅要在层与层之间往回传,还要沿着时间往回传,从最后一步一路回到第一步,好让末尾的误差能正确地「归咎」于许多步之前就起了作用的那些权重。由于每一步用的都是同一套权重,它们各自的贡献要在所有时间步上累加起来,才得到最终的调整量。
老实说,麻烦在于长链很脆弱。当误差信号沿着许多步往回走时,它要么倾向于衰减到几近于无(梯度消失问题,于是网络学不到长程的依赖),要么爆炸开来(梯度爆炸,训练就失稳)。这正是为什么普通循环网络在长序列上举步维艰,为什么 LSTM、GRU 这类架构被发明出来以保住信号,也为什么人们常用「截断式」随时间反向传播——只展开有限的一段步数,好让训练还跑得动。
一个网络要预测「我在法国长大……所以我能说一口流利的 ___」这句话的最后一个词。线索「法国」在许多个词之前。随时间反向传播必须把「猜错了」这个误差一路带回到读到「法国」的那一步——可在这么长的跨度上,信号往往就消失了,这正是 LSTM 被造出来要解决的那个弱点。
误差必须穿越时间往回走——而在长长的间隔上,它会渐渐淡去。
随时间反向传播并不是一种新算法——它就是把普通反向传播用在一个沿时间展开的网络上。它在实践中的局限(长序列上的梯度消失/爆炸),正是梯度裁剪、LSTM 和截断之所以存在的原因。