时隔4个多月,暑假去了Stanford同一个教室NVIDIA Auditorium上课,再次回到CS231N的课程,如今已是大三。没有退路。
2017年老师换了,内容也更新了,所以就不听去年的了。
本讲我预计是课程的核心内容,神经网络的介绍。注意Neural Networks包括CNN,RNN,DNN等,所以是个很基础的概念,用到的数学知识就是反向传播的链式法则。
Recap
Our objective: L关于W的导数(梯度)。
求梯度两种方式:数值解,不精确,而且慢;解析解,精确又快。
但解析解绝不能暴力计算,对于复杂的神经网络,drive you mad.
要用computational graph的backpropagation算法。
Backpropagation 反向传播
核心要义就是这张图。先正向传播value,然后反向传播gradient. 由chain rule,每条路径的gradient可以借助upstreaming的gradient值乘以local gradient计算得出。这样我们就能求出最终的结果:函数关于输入变量的gradient.
注意computational graph是一个流程图,我们引入函数的intermediate variable,来简化求导的计算。
常见的算符是加减乘除,取max等,根据求导的法则,下面结论是显然的。
但graph可以变化,是自定义的,你可以group一些结点成为一个复杂的结点,如sigmoid gate,而事实上由于sigmoid的求导容易,这并不复杂。这也是我们用自然对数e的原因。
一个结点可以连接连接两个结点(从左到右),反向传播求导时相加两个结果即可。
Vector’s perspective
Jacobian matrix
Suppose f : ℝn → ℝm is a function which takes as input the vector x ∈ ℝn and produces as output the vector f(x) ∈ ℝm. Then the Jacobian matrix J of f is an m×n matrix, usually defined and arranged as follows:
这是高数多元微积分的内容。雅可比矩阵,处理多元函数的梯度。神经网络唯一的理论难点。
举了一个例子:注意链式法则对于多个中间变量(qi)时,需要累乘相加求和。在处理时,注意jacobian的维数,以及矩阵向量的表示和运算,即可化简成最漂亮的结果。
另外,实际framework都把forward() get result & backward() get gradient封装好了,常见的函数如sigmoid都有。
Neural Network
我们从简单的线性函数起步,叠加RELU层激活函数配上另一个线性函数,就多了一层,如此构成深度神经网络233. 当然这是无脑做法。
这是常见的激活函数Activation function,如今RELU已经取代sigmoid,成为NN的标配。
但是,老师也坦言,真正生物上的NN远非是人工神经网络… 只是loose analogy 很弱的类比
以上即为神经网络的基本架构architecture.
由代码可以发现,每个hidden layer都是f(np.dot(Wi,hi)+bi) RELU(non-linear)+linear 结合
以上是神经网络的数学原理——chain rule和基本结构hidden layer的stack方式。下节课介绍CNN的卷积处理。
另外,A1布置了2-layer的构造。
Lecture Note
Understanding Backpropagation (BP 算法): [def] computing gradients of expressions through recursive application of chain rule.
understand its subtleties (subtlety 精妙!)
computing the gradient of
f
at
说实话,lecture note都是多元微分学知识,向量函数的求导加上矩阵运算搭配链式法则的求和是最难点了。