神经网络(三)

写在前面

  • 在这个章节, 我们将从头推导一个神经网络的反向传播过程. 反向传播在神经网络中非常重要, 要理解透彻神经网络的学习过程, 需要好好消化一下这里的内容.
  • 如果你对微积分还不够理解, 请先看微积分(一). 如果你对神经网络正向传播过程还不理解, 请先看神经网络(二)

误差

  • 我们需要有一个指标来了解预测有多差, 也就是误差 (error).
  • 这里 是预测值, y是真实值. 一个是所有输出单元j的和, 另一个是所有数据点 的和. 首先是内部这个对j的求和. 变量j代表网络输出单元. 所以这个内部的求和是指对于每一个输出单元, 计算预测值 与真实值y之间的差的平方, 再求和. 另一个对 的求和是针对所有的数据点. 也就是说, 对每一个数据点, 计算其对应输出单元的方差和, 然后把每个数据点的方差和加在一起. 这就是你整个输出的总误差.
  • 选择SSE有几个原因: 误差的平方总是正的, 对大误差的惩罚大于小误差. 同时, 它对数学运算也更友好.

反向传播

  • 依旧是上一个章节的例子, 再贴一下图:
  • 在上一个正向传播中, 我们是从Input->Hidden->Output, 而在反向传播中, 我们应该从总误差开始往上面推, 在这个图例, 就是从右边的Output Layer到左边的Input Layer, 一层一层的计算错误对节点的影响. 紧接着上一个章节, 我们假设正确的 , .
  • 总误差:


得出:


 

  • Output Layer到Hidden Layer: 以 为例, 对 求偏导, 计算 的影响.

同理可得:

 

 

  • ErrorTerm( ), 为激活函数, 为激活函数的导数:

则有:

带入到OutputGrade:

 

 

  • , 权重更新:

在这里 是学习率, 是ErrorTerm.
则有:

 

 

  • 更新后的权重值:

则有:

 

 

  • Input Layer, 以 为例, 对 求偏导, 计算 的影响(注意, 这里计算的时候Hidden Layer使用的是还未经过更新的权重值).

同理可推:

仔细看看:

得出:

同理可得:

 

 

  • 至此, 我们已经完整的将神经网络的学习过程(正反向传播)给推导了一遍.

写在后面

  • 在这篇文章里面, 我们对反向传播进行了推导, 但这还仅仅是开始.

神经网络(二)

写在前面

  • 在这个章节, 我们将从头推导一个神经网络的正向传播过程.

正向传播

  • 如图, 现有一神经网络拥有两个Input节点(i1, i2), 两个Hidden节点(h1, h2), 两个Output节点(o1, o2). 这里采用Sigmoid作为激活函数. 假设 , 为输入数据.
  • 从Input到HiddenInput:


    得出:

  • 激活HiddenInput得到HiddenOutput:

  • 从HiddenOutput到OutputInput:


    得出:

  • 激活OutputInput得到OutputOutput:

  • 到这里, 我们的正向传播就结束了, 最后得到两个输出节点的输出

写在后面

  • 在下个章节, 我们将从头推导一个神经网络的反向传播过程.

神经网络(一)

写在前面

  • 神经网络, 是深度学习领域中非常重要的概念, 在这个系列文章中, 将会带你理解一些基础概念, 并带你从头推导一个神经网络的正反向传播过程.
  • 在开始之前, 你可能需要掌握一部分微积分知识, 在这里, 附上之前写的微积分系列链接微积分(一), 如果觉得看文字描述比较吃力, 可以考虑看一下里面推荐的视频.

介绍

  • 神经网络, 顾名思义, 就是由多个神经元组成的网络结构. 上图为一个神经元的组成结构, 一个神经元通常具有多个树突, 主要用来接受传入信息. 而轴突只有一条, 轴突尾端有许多轴突末梢可以给其他多个神经元传递信息. 轴突末梢跟其他神经元的树突产生连接, 从而传递信号. 这个连接的位置在生物学上叫做'突触'.

只有一个Feature输入的一个神经元

  • 上图为只有一个Feature输入的一个神经元, 将 作为feature输入, 输入时神经元会对其输入做 的处理, 之后使用active(激活函数激活), 并将其输出. w在这里表示weight, 权重; b在这里表示bias, 偏差.
  • 稍微对线性代数有些了解的话, 应该知道 就是一条直线, 这里很好理解. 由于线性模型在某些场景表达能力不足, 加入了active(激活函数), 使其能表述非线性因素.

输入多个Features

  • 你可能第一眼看到这个图会有点懵, 在这里圆圈代表单元, 方块代表运算. 如果没看懂, 不要慌, 问题不大. 容我慢慢给你解释.
  • 我们用 来表示所有的Features, 那么这里的 中的两个Feature, 最后面那个1是权重的系数, 也就是说在求和这步应该是 , 简化一下就是 , 你应该非常熟悉这个公式, 它跟线性回归模型是一样的!
  • f(h)为激活函数.

激活函数

  • 神经网络中四种常见的激活函数: Sigmoid, ReLU, TanH, Softmax.

  • 上图为Sigmoid函数图形, Sigmoid函数值域是0到1之间, 它的输出还可以被解释为成功的概率. 实际上, 用Sigmoid函数作为激活函数的结果, 跟对数几率回归(Logistic回归)是一样的. 适用于二分类模型.
  • 优点: 在特征相差比较复杂或是相差不是特别大时效果比较好.
  • 缺点: 计算量大, 反向传播求误差梯度时, 求导涉及除法, 容易出现梯度消失的情况, 从而无法完成深层网络的训练.

  • TanH函数也被称为双切正切函数, 取值范围为[-1, 1].
  • 其实就是在Sigmoid函数的基础上做一个变形, 把曲线整体下拉0.5个单位(经过原点)就得到TanH.

  • ReLu函数, 输入信号<0时, 输出都是0; 输入信号>0的情况下, 输出等于输入.
  • 优点: 计算速度非常快, 只需要判断输入是否大于0, 收敛速度远快于Sigmoid和TanH.
  • 缺点: 某些神经元可能永远不会被激活, 导致相应的参数永远不能被更新.

  • Softmax函数主要用于多分类任务, 通常情况下, 我们只会在神经网络的最后一层会采用Softmax函数, 通过运算之后每个神经元会得到一个概率, 用于判断它属于哪个分类.

梯度下降

  • 在神经网络中的梯度下降, 就是对weights, bias进行学习的过程.

写在后面

  • 这个章节中, 对神经网络中的一些基本概念与常用函数做了介绍, 我们将在下个章节内推导正向传播过程.

微积分(四)

写在前面

  • 在这个章节中, 我们主要来探讨如何针对组合函数求导, 其中包括, 函数相加, 函数相乘, 以及链式法则.

加法法则

  • 如图, 我们想要对函数 求导.
  • 假设 , 则此处 . 假设在此处增长微量 , 则增加的高度变化值为 , 最后推导出 .
  • 加法法则:

乘法法则

  • 如图, 我们要对函数 求导.
  • 假设增长微量 , 则增加的面积变化值为 , 由于 非常小, 这里可以将其忽略, 则有 , 最后推导出 .
  • 乘法法则(左乘右导, 右乘左导):

链式法则

  • 如图, 我们要对函数 求导.
  • 最上面的x为x轴的值, 这个值会直接影响 的结果, 的结果会直接对 的结果造成影响.
  • 我们假设x移动了一个微量dx, 这个dx对 造成的影响为 , 我们暂且将 看做函数h, 则h对 造成的影响为 , 最后将 带入, 推导出 , 得出
  • 在这里, 我们必须一提的链式法则来了:

                        

写在最后

  • 这章节中, 主要介绍了加法法则, 乘法法则, 链式法则以及其推导过程, 这些知识都是非常基础且重要的.

微积分(三)

写在前面

  • 在这篇文章中, 将会用图例的方式来对一些常用的求导公式进行讲解, 以便于对微积分概念的理解.

关于

  • 我们先从 开始理解.
  • 如图, 假设我们要在 上增加一个微量 (其实这里就是对 求导), 那会增加图中黄色矩形部分面积.
  • 我们暂且叫这个部分增加的面积为df, 那么计算一下黄色矩形部分的面积:

  • 由于 非常小, 试想, 假设 , 则有 , 对我们整体数据的影响是非常小的, 所以可以忽略这部分的值不计, 最后得出
  • 得出 的导数:
  • 然后我们接下来看看 .
  • 同样的, 假设我们要在 上增加一个微量 , 会增加图中黄色部分面积.
  • 则有:

  • 忽略非常小的 后得到 .
  • 时, 新的函数值为:

  • 忽略这些非常小的 , 最后得到 , .
  • 抽象的说, 中, 无论n是多少, 的导数都为 .
  • 最后得到幂函数求导公式:

关于

  • 如图, 假设我们要在 上增加一个微量 , 并已知小直角三角形与大直角三角形相似.
  • 则有 (就是临边比斜边), 不正是 吗.
  • 最后得到结论:

一些常用的求导公式

写在最后

  • 这章详细介绍了 , 用图形求解的方法, 并熟悉了些比较常用的求导公式.
  • 在下一章中, 我们将主要探讨, 函数求和, 乘积, 复合函数.

微积分(二)

写在前面

  • 在上次的文章中, 大致的对微积分的思路与过程做了个介绍, 这次我们将进行更加深入的讨论.

关于d

  • 如图, 在汽车行驶速度的讨论中( 为汽车行驶时间与距离的关系函数 ), 我们将速度定义成 . 则小车在当前点的行驶速度为 . 当dt的值非常小时, 我们近似的将其看做为这个点的切线. 而速度则是此切线的斜率.
  • 在微积分里, 我们都会采用这种思路来分析解决问题, 这里的dt是个非常微小的值, 却又是真实存在, 且不为零的.
  • 在微积分里, 用d表示一个变量趋近于零.

一个简单的求导过程

  • 如图, 我们假设现在要求小车在2秒的速度 .
  • 已知 .
  • 为第2秒到 秒的距离差, 为时间上的变化, 极为微小.
  • 得出:

            

            

            

            

  • 当dt逼近于零, 非常小的时候, 可以忽略后面的 .
  • 则可得出最后的结果 . 当然这个结果是有规律可循的, 这个我们接下来慢慢讲.
  • 这个结果不仅仅对 有效, 同样的, 对整个 都有效.
  • 得出结果 .

0秒时的速度

  • 通过对上一题图中的观察, 我们详细观察在 ~ ( ) 秒间车轮的动态, 也就是 .
  • 可以发现, 在 ~ ( )之间, 车轮发生的位移非常小. 以至于 最终导致 .
  • 注意, 这里是近似为零, 由于这段时间行驶的距离非常小, 我们近似的将其作为零来处理.

写在最后

  • 这个章节以小车的距离/时间曲线为例, 详细的讲解了对函数求解的思路与方法.
  • 下一小节, 我们将会用图例的方式来对一些常用的求导公式进行讲解.

微积分(一)

写在前面

  • 这里开始补充一些机器学习中所会经常接触到的微积分知识.
  • 最近在看B站本质系列, 链接贴一下微积分的本质 - 01, 有兴趣的童鞋也可以去看看, 讲得很基础.

关于圆的面积

对于圆的面积的算法一开始我们并不清晰, 如果用微积分的思路, 将其分为多个微小的同心圆, 则可将其展开. 下图为一个宽度非常小的同心圆(当然, 这里为了方便查看与学习, 将其放大了.), 将其从原型中抽离出来的模样.

将它拉直了之后, 可以近似的看成是一个长方形.

我们假设这个长方形的宽度是dr, 这里的dr如果取值越小, 划分越细, 就越接近与圆的真实面积. 已知圆的周长是可以用 来计算的, 那么就得到下图.

这样我们就可以计算每个空心圆的面积 . 将这些同心的空心圆展开后放在坐标轴中, 并绘制相应的周长函数(那条直线).

可以发现, 只要当dr取值足够小时, 就可以通过微积分的方法近似算出圆形的面积. 注意, 我们这里是在做近似.

不难发现, 我们需要求的圆形面积, 就是底下这个三角形的面积.

在这里 , , 那么可以得出

当然这个在所有的圆形面积计算中都会奏效, 假设圆形半径为R, 则圆形面积则为

解决难题的思路

  • 当一个难题难以解决时, 尝试将其划分为多个微小的值, 先去求原问题的近似.

积分

找到一个可以表示这个Area大小变化的函数.

导数

假设 就是可以表示这个Area大小变化的函数. 如图, 假设 轴发生了细微的变化 , 将此部分近似看成长方形, 则此部分面积表示为 . 将 放到等式的左边, 则推导出 . 在这里 叫做A的导数, 是当 越来越小时, 这个比值趋向的值.

写在最后

  • 在这个章节中, 我们认识了积分与导数, 以及一些基本的推导过程和解决难题的方法, 这些方法不仅仅可以运用在数学领域, 还被充分的运用在多个领域, 是我们值得深思与研究的. 当然, 现实中的问题, 也会更加的复杂.

MinMaxScaler in sklearn

  • sklearn中的特征缩放
➜ test ✗ cat MinMaxScaler.py
# 导入MinMaxScaler
from sklearn.preprocessing import MinMaxScaler

# 使用numpy存储数据
import numpy

# 将权重以浮点数形式存储在numpy.array中, 如若此处为整数, fit_transform时会报错
weights = numpy.array([[115.], [140.], [175.]])

# 生成MinMaxScaler对象
scaler = MinMaxScaler()

# 使用fit_transform()计算特征缩放后的权重
rescaler_weights = scaler.fit_transform(weights)

# 结果输出
print(rescaler_weights)

执行结果:

➜ test ✗ python3 MinMaxScaler.py
[[0.        ]
 [0.41666667]
 [1.        ]]

关于路由表

  • route
    查看或修改路由表
route  [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate] [[dev] If]

常用参数:

        -n                                 //查看时不使用域名解析
        add                                //添加路由条目
        del                                //删除路由条目
        -net                               //添加网段
        gw                                 //gateway(网关)
        default                            //设定默认

例如:

[root@kyle ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
2.2.2.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.204.0   0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
172.16.104.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         2.2.2.1         0.0.0.0         UG    0      0        0 eth0
[root@kyle ~]# route add default gw 2.2.2.254                          //添加默认网关
[root@kyle ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
2.2.2.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.204.0   0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
172.16.104.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         2.2.2.254       0.0.0.0         UG    0      0        0 eth0
0.0.0.0         2.2.2.1         0.0.0.0         UG    0      0        0 eth0
[root@kyle ~]# route del default gw 2.2.2.254                          //删除默认网关
[root@kyle ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
2.2.2.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.204.0   0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
172.16.104.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         2.2.2.1         0.0.0.0         UG    0      0        0 eth0
[root@kyle ~]# route add -net 192.168.2.0/24 eth0                          //添加网段
[root@kyle ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
2.2.2.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.204.0   0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
172.16.104.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         2.2.2.1         0.0.0.0         UG    0      0        0 eth0
[root@kyle ~]# route del -net 192.168.2.0/24 eth0                          //删除网段
[root@kyle ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
2.2.2.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.204.0   0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
172.16.104.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         2.2.2.1         0.0.0.0         UG    0      0        0 eth0
  • /proc/net/dev
    查看网络状况
[root@kyle ~]# cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo: 2474304    2458    0    0    0     0          0         0  2474304    2458    0    0    0     0       0          0
  eth0:332565751  977628    0    0    0     0          0         0 73458156  967301    0    0    0     0       0          0
  sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
vmnet1:       0       0    0    0    0     0          0         0        0      46    0    0    0     0       0          0
vmnet8:       0       0    0    0    0     0          0         0        0      46    0    0    0     0       0          0
  • netstat
    查看网络信息
netstat [address_family_options] [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--numeric-hosts][--numeric-ports][--numeric-
       ports] [--symbolic|-N] [--extend|-e[--extend|-e]] [--timers|-o] [--program|-p] [--verbose|-v] [--continuous|-c] [delay]

常用选项:

        -r                                        //查看路由
        -n                                        //不做域名解析
        -i                                        //查看接口
        -e                                        //查看详细
        -a                                        //查看所有端口状态
        -t                                        //查看tcp端口的信息
        -u                                        //查看utp端口的信息
        -l                                        //查看正在监听的端口
        -p                                        //查看正在使用此端口的进程

例如:

[root@kyle ~]# netstat -luntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      2538/hpiod         
tcp        0      0 0.0.0.0:609                 0.0.0.0:*                   LISTEN      2123/rpc.statd      
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2662/mysqld         
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2088/portmap        
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2565/cupsd         
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2695/sendmail: acce
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      2543/python         
tcp        0      0 :::80                       :::*                        LISTEN      2723/httpd         
tcp        0      0 :::22                       :::*                        LISTEN      2556/sshd           
udp        0      0 0.0.0.0:48958               0.0.0.0:*                               2820/avahi-daemon:  
udp        0      0 0.0.0.0:603                 0.0.0.0:*                               2123/rpc.statd      
udp        0      0 0.0.0.0:606                 0.0.0.0:*                               2123/rpc.statd      
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               2820/avahi-daemon:  
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2088/portmap        
udp        0      0 0.0.0.0:631                 0.0.0.0:*                               2565/cupsd         
udp        0      0 :::59753                    :::*                                    2820/avahi-daemon:  
udp        0      0 :::5353                     :::*                                    2820/avahi-daemon:
  • tcpdump
    抓包工具
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
               [ -C file_size ] [ -F file ]
               [ -i interface ] [ -m module ] [ -M secret ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E spi@ipaddr algo:secret,...  ]
               [ -y datalinktype ] [ -Z user ]
               [ expression ]

常用选项:

        -A                           //以ASCII形式显示所有数据包信息
        udp                          //查看udp数据包信息
        tcp                          //查看tcp数据包信息
        arp                          //查看arp数据包信息
        icmp                         //查看icmp数据包信息
        port                         //指定查看端口
        -w                           //将输出保存到文件
        -vv                          //查看详细信息

例如:

tcpdump dst port 80                  //查看目标为dst80端口的所有数据包信息
tcpdump dst 2.2.2.50                 //查看来自2.2.2.50目标为dst的所有数据包的信息

将VIM变成开发PHP的IDE

  • NERDTree

目录管理,树状导航

[root@kyle download]# wget -c http://www.vim.org/scripts/download_script.php?src_id=11500
[root@kyle download]# mkdir NERD_tree/
[root@kyle download]# mv NERD_tree.zip NERD_tree/
[root@kyle download]# cd NERD_tree/
[root@kyle NERD_tree]# unzip NERD_tree.zip
[root@kyle NERD_tree]# cp -rvf plugin/* ~/.vim/plugin/
[root@kyle NERD_tree]# cp -rvf doc/* ~/.vim/doc/
[root@kyle NERD_tree]# cp -rvf nerdtree_plugin/ ~/.vim/
[root@kyle NERD_tree]# vim /etc/vimrc
在最后添加:
nmap <F2> :NERDTree  <CR>
  • taglist

函数和变量标签

[root@kyle download]# wet -c http://www.vim.org/scripts/download_script.php?src_id=7701
[root@kyle download]# mkdir taglist/
[root@kyle download]# mv taglist_45.zip taglist/
[root@kyle download]# cd taglist/
[root@kyle taglist]# unzip taglist_45.zip
[root@kyle taglist]# cp -rvf plugin/* ~/.vim/plugin/
[root@kyle taglist]# cp -rvf doc/* ~/.vim/doc/
[root@kyle taglist]# vim /etc/vimrc
在最后添加:
nmap <F3> :Tlist  <CR>
  • php-doc

生成php注释文档

[root@kyle download]# wget -c http://www.vim.org/scripts/download_script.php?src_id=4666
[root@kyle download]# cp -rvf php-doc.vim ~/.vim/plugin/
[root@kyle download]# vim /etc/vimrc
在最后添加:
inoremap <C-P> <ESC>:call PhpDocSingle()<CR>i
nnoremap <C-P> :call PhpDocSingle()<CR>
vnoremap <C-P> :call PhpDocRange()<CR>
  • ACP

自动补齐

[root@kyle download]# wget -c http://www.vim.org/scripts/download_script.php?src_id=11894
[root@kyle download]# mkdir ACP
[root@kyle download]# cp -rvf vim-autocomplpop.zip ACP/
[root@kyle ACP]# unzip vim-autocomplpop.zip
[root@kyle ACP]# cp -rvf autoload/ ~/.vim/
[root@kyle ACP]# cp -rvf doc/* ~/.vim/doc/
[root@kyle ACP]# cp -rvf plugin/* ~/.vim/doc/
[root@kyle ACP]# cd /root/.vim/

上网去下载php_funclist.txt
本人是去phpdoc-doc-base上面复制粘贴到到~/.vim/php_funclist.txt

[root@kyle ACP]# vim /etc/vimrc
在最后添加:
set dictionary-=~/.vim/php_funclist.txt dictionary =~/.vim/php_funclist.txt
set complete-=k complete =k