要想在Torch框架下解决计算机视觉中的增强学习问题(例如Visual Attention),可以使用Nicholas Leonard提供的dpnn包。这个包对Torch中原有nn包进行了强大的扩展,在Torch官方的教程中予以推荐。
增强学习是一个非常广阔的领域,本文只从理解代码的角度进行最简单说明。
理念
机器学习可以分为三支:
- 无监督学习(unsupervised):没有教师信号。例:给定一系列图片,学习网络参数,能够按照训练集的概率,生成新的图片。聚类也是一种无监督学习。
- 监督学习(supervised):有教师信号,教导正确的动作。例:手把手教你下棋:这种局面下这儿,那种局面下那儿。常见的图像识别问题也是监督学习。
- 增强学习(reinforce):有教师信号,但不知道正确的动作是什么,只给出动作的反馈。例:其实我也太不会下棋,但是你下完我知道数子儿判断输赢。
对于同一个问题,可以用不同的观点来看待。以手写数字识别任务为例:
监督学习观点下,把分类结果看成动作,教师给出的是标定的分类结果。
增强学习观点下,把每次观察位置看成动作1,教师给出的反馈是分类正确与否。
监督学习
作为复习,先来看看监督学习网络的结构:
网络输入为 x x x,输出为 y y y。输出由网络参数 θ \theta θ控制:
y = f ( x ; θ ) y=f(x;\theta) y=f(x;θ)
训练时,需要在后面接一个**准则(Criterion)**模块充当教师,给出一个代价函数 E E E。
准则模块是解析的,可以求出代价对输出的导数:
g r a d O u t = ∂ E ∂ y gradOut=\frac{\partial E}{\partial y} gradOut=∂y∂E
根据链式法则,进一步可以求出代价对输入的导数:
g r a d I n = g r a d O u t ⋅ ∂ y ∂ x = ∂ E ∂ x gradIn = gradOut \cdot \frac{\partial y}{\partial x} = \frac{\partial E}{\partial x} gradIn=gradOut⋅∂x∂y=∂x∂E
网络模块可以串接:
g r a d I n n + 1 = g r a d I n n ⋅ ∂ y n ∂ x n {gradIn}_{n+1}={gradIn}_n \cdot \frac{\partial y_n}{\partial x_n} gradInn+1=gradInn⋅