back propagation算法原理简述

back propagation - 即反向传播,因为error function是关于输出层的函数,error function对隐藏层系数求偏导涉及输出层求导,所以,本质上,反向传播算法的推导,是链式求导的推导过程。所以我们先看看链式求导(复合求导)。

假设:
h = f(u) = f(w,x)
y = g(u') = g(w',h)

那么:
dy/dw' = dg/du' * du/dw'

其中,我们假设h为隐藏层,y为输出层(简化描述,假设就1个输入层、1个隐层、1个输出层)
在整个推导过程,我们的目的是求得w、w',即网络参数。

隐藏层系数:w
输出层系数:w'

假设我们采用MSE作为loss function:
E = 1/2 *sum( (label - y)^2 )

1、输出层
输出层的输入为隐藏层h输出u',对任意输出层的输入ui'进行求导:
dE/dui' = dE/dy * dy/dui' = (y-label) * dy/dui' 记为 EI'
由于y一般为sigmoid function,y为训练过程输出值(依赖隐藏层、输入层等),label为目标值

所以:
EI' = (y-label) * y * (1-y)

对任意的输出层的系数wi' 求导,复合求导,先求y的相关系数h,然后h关于wi'求导
dE/dwi' = dE/dui' * dui'/dwi' = EI' * dui'/dwi'

由于:
u' = sum(h * w')
所以:
dE/dwi' = dE/dui' * dui'/dwi' = EI' * hi

2、隐藏层
h为隐藏层的输出,参照以上流程,对任意hi求导,u'是关于h的函数,根据复合求导规则:
dE/dhi = dE/du' * du'/dhi = EI' * wi'

可以看到隐藏的求导结果依赖了输出层的求导结果,也即,体现了反向传播的内在含义。

继续对隐藏层的任意系数求导:wi
dE/dwi = dE/dhi * dhi/dui * dui/dwi = EI' * wi' * dhi/dui * xi

dhi/dui 取决于隐藏层采用什么类型的目标函数,假设还是sigmod function,则:
dE/dwi = EI' * wi' * hi * (1-hi) * xi 记为 EI

可见,隐藏层的参数更新依赖于 输出层的EI',初始化随机撒点,得到y,根据随机梯度下降算法更新wi、wi',即可求得wi、wi'系数。

参考:arXiv:1411.2738

back propagation算法原理简述

SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number问题

最近尝试使用crf++ 进行NER训练,在mac环境下,采用brew安装

brew install crf++
出现以下错误:
SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

解决方案:
在公司代理环境下,配置的https代理是没必要的,只需要 http代理即可,相关说明:

Uses proxy env variable httpproxy == 'https://proxy.in.tum.de:8080'
^^^^^
The https:// is wrong, it should be http://. The proxy itself should be accessed by HTTP and not HTTPS even though the target URL is HTTPS. The proxy will nevertheless properly handle HTTPS connection and keep the end-to-end encryption. See HTTP CONNECT method for details how this is done.

https://stackoverflow.com/questions/50840101/curl-35-error1408f10bssl-routinesssl3-get-recordwrong-version-number

But
mac实验,terminal中使用pip安装python程序,https proxy设置还是必要的,所以肯定是哪里设置有问题,对于https,其实可以这么设置:
https_proxy='http://proxy.in.tum.de:8080'

SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number问题