洞明先生的博客

穷通悟理是极乐
  新随笔  :: 管理

反向传播_七月算法5月深度学习班第3次课程笔记

Posted on 2016-06-01 17:12  洞明  阅读(734)  评论(0编辑  收藏  举报
 
 
  desc
梯度与斜率区别
斜率是数值没有方向,核心表示的是速率
梯度有方向的,核心想要表示的是某一个方向
 
梯度并不是简单的 y 对于每一个维度上的偏导的 拼接组合,即:
grad(f) = (df/dx·i, df/dy·j, df/dz·k) 
其中 后面缀的 一定是 i j k 这三个基就可以了
因为具体的方向问题,由于前面的df/dx,df/dy,df/dz 三个数值决定的
 
为什么 梯度方向是 函数增加最快的方法
先建立一个概念:方向导数
 
方向导数的属性:是一个标量,即  标量函数 —> 标量的方向导数
含义:函数沿着这个方向的增长率
定义式:
推导式:
(第一处 等价变换)
这两个式子是等价的
确切的说,因为 方向导数的定义式可以拆成 这个框架,所以才会定义出 
df/dx·i, df/dy·j, df/dz·k  是梯度
 
然后 再进一步等价操作发现:
fx(x0, y0) · cosα + fy(x0, y0) · cosβ    
= (fx(x0, y0),  fy(x0, y0))  ·  (cosα, cosβ)          (第二处 等价变换)
相当于是两个 向量的点积
这里的 fx(x0, y0),  fy(x0, y0) cosα, cosβ 都是相对于原点的方向,引入 基向量 i j,表示为:
= (fx(x0, y0)i,  fy(x0, y0))  ·  (cosαi , cosβj )
再对上面的式子再 做进一步的等价操作发现:
|| fx(x0, y0)i,  fy(x0, y0)j || ·  ||cosαi , cosβj|| · cosΘ     (第三处 等价变换)
其中 Θ是 方向 l 与 (fx(x0, y0)i,  fy(x0, y0)j)  的夹角,其中 对于 (fx(x0, y0)i,  fy(x0, y0)j )而言,其前面的系数决定其具体方向
夹角为0,至最大,即  方向导数最大
 
从 点积的角度:如果 fx(x0, y0) 为负数,那么 cosα 也要为负数
如果 fy(x0, y0) 为负数,那么 cosβ 也要为负数
这样 点积之后 值一定是 大于等于 0 的
真因为是 有这个平方的关系,导致了 梯度方向的 方向导数一定是正数
因为 梯度方向的方向导数是 A^2 + B^2 的关系
 
summary:
· 从梯度的定义式 到 梯度的推导式发现,如果 选一个方向 与 (fx(x0, y0)i,  fy(x0, y0)j ) 方向一致,那么,此时的 方向导数(标量)为正数,且是最大的
· 为正数,代表了 函数增加,由 A^2 决定(这个地方解释了为什么此时的方向导数一定是正数)
· 为最大,由 Θ=0 决定,从 ||A||·||B||·cosΘ 的角度去思考的
 
注意,i j 确实代表了 坐标轴的方向,但是 (fx(x0, y0)i, fy(x0,y0)j) 由于α 和 β值的不同,得到一个不同的方向
所以,
才要求 cosα, cosβ 在数值上 与fx(x0,y0 ), fy(x0,y0) 成比例,这是 方向一致的 数学等价表达【观点】
要求 某方向与梯度方向一致,等价于
要求 cosα, cosβ 在数值上 与 fx(x0,y0 ), fy(x0,y0) 成比例
 
此时的结论:
grad(f) = fx'·i + fy'·j,这个值的属性表示的是一个方向,i j 仅仅是基,方向由 fx' 和 fy' 决定,沿这个方向,方向导数值大于零且最大
 
refer
同济高数,第九章第七节
梯度的分类:
 
数值梯度 和 解析梯度
解析梯度 即用数学求导的方法求得
数值梯度 用数值方法计算:两点法逼近,即  f(x+σ) - f(x)/ σ 
此时直接用一个 很小的值 就可以计算了,而省去了 lim 的极限操作
如何用两点法求数值
# 不仅仅是 数值偏导
更是数值梯度
数值梯度直接利用的定义公式,不需要知道函数定义,直接用两个点算就可以了 
 
这里的代码, x 是一维度的。
所以 这个 while 循环 和 iter 迭代化,用最 naive 的方法替代就是:
for i in xrange(len(x)):  每次操作 x[i]  就可以了
数学优化与 机器学习中 优化的 对应关系
数学中的 优化问题是  y =f(x1, x2) 的形式来优化
 
机器学习中的优化问题: cost = f(w1, w2) 即:
目标值是 cost,而不是 pred值
自变量是 w,而不是input_data_x1, input_data_x2
找好这个对应关系就好理解了
 
容易产生迷惑的点就是:
机器学习中往往把 input 表示为 x,以至于你误以为 要对 x求导,其实不是啊,是对参数w 求导
这里的 x 是常量,是参数,不是变量,变量是 w
 
机器学习中,比如神经网络的最终值,其实就是 cost值,或者是似然值,已经是你待优化的值了,对于 ||y-cost||2 就可以当成 网络中的一个节点操作。所以 网络的输出就是 待优化函数,就像 这个图 表示的就是单纯的要 优化 sigmoid 函数一样
本节课 
推导了 神经网络的 的BP 过程
给出了一个 在图形上 形式化的 链式法则的过程
反向传播
1. 本质就是一个链式法则
 
2. 所谓的残差传递 ,是因为目标函数就是误差值,所以导数被称为残差
 
3. 在链式求导过程中,前面乘的那些导数 叫做 反向系数
 
4. 反正从 pred 到 cost, 就是多了一 node 节点而已
符号说明
⊙是一般是指同或
在论文里面可能是 element-wise 乘法
引入指示函数的作用
可以给 分段函数 得到 解析导数
与导数相关的矩阵
一阶梯度是 vector
二阶梯度是 Hessian 矩阵
 
雅克比矩阵,是 从 m 维 到 n维度的映射
所以才有:m*n 的矩阵
关于caffe 其实caffe不需要做什么编码工作,用起来比较简单,当然,我指的是图像。
docker 在 DL中的应用
caffe, Torch同样也可以使用Docker的镜像来安装到容器里
作用:免去搭建环境的烦恼
所以李勇 说 安装caffe 一个星期的配置时间,其实可以用 docker 来做
倒三角的微分算子表示 
input 标量, output 矢量
视它为一个函数,一个指定的操作过程
而 方向导数就是 它的输出的 各个维度上的加和,对应乘方向夹角
你自己可以写一个深度学习的框架
现在的你 可以自己实现 这个过程了
2016/5/21 星期六 22:44
 
只要解决了 这个求导的过程
 
第一种是:数值梯度
第二种是:层层导数