神经网络理论基础及 Python 实现

2017 年 7 月 15 日 Python开发者

(点击上方蓝字,快速关注我们)


来源:温梦月 

www.jianshu.com/p/4824a45fc87d#

如有好文章投稿,请点击 → 这里了解详情


一、多层前向神经网络


多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;


输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;


除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络;


一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程;



二、设计神经网络结构


使用神经网络之前,必须要确定神经网络的层数,以及每层单元的个数;


为了加速学习过程,特征向量在传入输入层前,通常需要标准化到0和1之间;


离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值


比如:特征值A可能去三个值(a0,a1,a2),那么可以使用3个输入单元来代表A

  • 如果A=a0,则代表a0的单元值取1,其余取0;

  • 如果A=a1,则代表a1的单元值取1,其余取0;

  • 如果A=a2,则代表a2的单元值取1,其余取0;



神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。


没有明确的规则来设计最佳个数的隐藏层,一般根据实验测试误差和准确率来改进实验。


三、交叉验证方法


如何计算准确率?最简单的方法是通过一组训练集和测试集,训练集通过训练得到模型,将测试集输入模型得到测试结果,将测试结果和测试集的真实标签进行比较,得到准确率。


在机器学习领域一个常用的方法是交叉验证方法。一组数据不分成2份,可能分为10份,

  • 第1次:第1份作为测试集,剩余9份作为训练集;

  • 第2次:第2份作为测试集,剩余9份作为训练集;

  • ……


这样经过10次训练,得到10组准确率,将这10组数据求平均值得到平均准确率的结果。这里10是特例。一般意义上将数据分为k份,称该算法为K-fold cross validation,即每一次选择k份中的一份作为测试集,剩余k-1份作为训练集,重复k次,最终得到平均准确率,是一种比较科学准确的方法。



四、BP算法


通过迭代来处理训练集中的实例;


对比经过神经网络后预测值与真实值之间的差;


反方向(从输出层=>隐藏层=>输入层)来最小化误差,来更新每个连接的权重;


4.1、算法详细介绍


输入:数据集、学习率、一个多层神经网络构架;


输出:一个训练好的神经网络;


初始化权重和偏向:随机初始化在-1到1之间(或者其他),每个单元有一个偏向;对于每一个训练实例X,执行以下步骤:


1、由输入层向前传送:


结合神经网络示意图进行分析:



由输入层到隐藏层:



由隐藏层到输出层:



两个公式进行总结,可以得到:



Ij为当前层单元值,Oi为上一层的单元值,wij为两层之间,连接两个单元值的权重值,sitaj为每一层的偏向值。我们要对每一层的输出进行非线性的转换,示意图如下:



当前层输出为Ij,f为非线性转化函数,又称为激活函数,定义如下:



即每一层的输出为:



这样就可以通过输入值正向得到每一层的输出值。


2、根据误差反向传送 对于输出层:其中Tk是真实值,Ok是预测值



对于隐藏层:



权重更新:其中l为学习率



偏向更新:



3、终止条件


  • 偏重的更新低于某个阈值;

  • 预测的错误率低于某个阈值;

  • 达到预设一定的循环次数;


4、非线性转化函数


上面提到的非线性转化函数f,一般情况下可以用两种函数:


(1)tanh(x)函数:


  • tanh(x)=sinh(x)/cosh(x)

  • sinh(x)=(exp(x)-exp(-x))/2

  • cosh(x)=(exp(x)+exp(-x))/2


(2)逻辑函数,本文上面用的就是逻辑函数


五、BP神经网络的python实现


需要先导入numpy模块


import numpy as np


定义非线性转化函数,由于还需要用到给函数的导数形式,因此一起定义


def tanh(x):

    return np.tanh(x)

def tanh_deriv(x):

    return 1.0 - np.tanh(x)*np.tanh(x)

def logistic(x):

    return 1/(1 + np.exp(-x))

def logistic_derivative(x):

    return logistic(x)*(1-logistic(x))


设计BP神经网络的形式(几层,每层多少单元个数),用到了面向对象,主要是选择哪种非线性函数,以及初始化权重。layers是一个list,里面包含每一层的单元个数。


class NeuralNetwork:

    def __init__(self, layers, activation='tanh'):

        """

        :param layers: A list containing the number of units in each layer.

        Should be at least two values

        :param activation: The activation function to be used. Can be

        "logistic" or "tanh"

        """

        if activation == 'logistic':

            self.activation = logistic

            self.activation_deriv = logistic_derivative

        elif activation == 'tanh':

            self.activation = tanh

            self.activation_deriv = tanh_deriv

 

        self.weights = []

        for i in range(1, len(layers) - 1):

            self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)

            self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)


实现算法


    def fit(self, X, y, learning_rate=0.2, epochs=10000):

        X = np.atleast_2d(X)

        temp = np.ones([X.shape[0], X.shape[1]+1])

        temp[:, 0:-1] = X

        X = temp

        y = np.array(y)

 

        for k in range(epochs):

            i = np.random.randint(X.shape[0])

            a = [X[i]]

 

            for l in range(len(self.weights)):

                a.append(self.activation(np.dot(a[l], self.weights[l])))

            error = y[i] - a[-1]

            deltas = [error * self.activation_deriv(a[-1])]

 

            for l in range(len(a) - 2, 0, -1):

                deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))

            deltas.reverse()

 

            for i in range(len(self.weights)):

                layer = np.atleast_2d(a[i])

                delta = np.atleast_2d(deltas[i])

                self.weights[i] += learning_rate * layer.T.dot(delta)


实现预测


    def predict(self, x):

        x = np.array(x)

        temp = np.ones(x.shape[0]+1)

        temp[0:-1] = x

        a = temp

        for l in range(0, len(self.weights)):

            a = self.activation(np.dot(a, self.weights[l]))

        return a


我们给出一组数进行预测,我们上面的程序文件保存名称为BP


from BP import NeuralNetwork

import numpy as np

 

nn = NeuralNetwork([2,2,1], 'tanh')

x = np.array([[0,0], [0,1], [1,0], [1,1]])

y = np.array([1,0,0,1])

nn.fit(x,y,0.1,10000)

for i in [[0,0], [0,1], [1,0], [1,1]]:

    print(i, nn.predict(i))


结果如下:


([0, 0], array([ 0.99738862]))

([0, 1], array([ 0.00091329]))

([1, 0], array([ 0.00086846]))

([1, 1], array([ 0.99751259]))


看完本文有收获?请转发分享给更多人

关注「大数据与机器学习文摘」,成为Top 1%

登录查看更多
6

相关内容

【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
255+阅读 · 2020年6月10日
干货书《数据科学数学系基础》2020最新版,266页pdf
专知会员服务
314+阅读 · 2020年3月23日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
331+阅读 · 2020年3月17日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【新书】Pro 机器学习算法Python实现,379页pdf
专知会员服务
195+阅读 · 2020年2月11日
卷积神经网络概述及Python实现
云栖社区
4+阅读 · 2018年9月1日
免费|机器学习算法Python实现
全球人工智能
5+阅读 · 2018年1月2日
动手写机器学习算法:SVM支持向量机(附代码)
七月在线实验室
12+阅读 · 2017年12月5日
TensorFlow实现神经网络入门篇
机器学习研究会
10+阅读 · 2017年11月19日
机器学习基础篇--监督学习经典案例(Python实现)
Python技术博文
8+阅读 · 2017年10月24日
机器学习(15)之支持向量机原理(一)线性支持向量机
机器学习算法与Python学习
6+阅读 · 2017年9月1日
机器学习(7)之感知机python实现
机器学习算法与Python学习
4+阅读 · 2017年7月23日
Arxiv
18+阅读 · 2019年1月16日
Adaptive Neural Trees
Arxiv
4+阅读 · 2018年12月10日
Arxiv
6+阅读 · 2018年8月27日
Arxiv
5+阅读 · 2018年5月5日
Arxiv
5+阅读 · 2018年1月16日
VIP会员
相关VIP内容
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
255+阅读 · 2020年6月10日
干货书《数据科学数学系基础》2020最新版,266页pdf
专知会员服务
314+阅读 · 2020年3月23日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
331+阅读 · 2020年3月17日
《深度学习》圣经花书的数学推导、原理与Python代码实现
【新书】Pro 机器学习算法Python实现,379页pdf
专知会员服务
195+阅读 · 2020年2月11日
相关资讯
卷积神经网络概述及Python实现
云栖社区
4+阅读 · 2018年9月1日
免费|机器学习算法Python实现
全球人工智能
5+阅读 · 2018年1月2日
动手写机器学习算法:SVM支持向量机(附代码)
七月在线实验室
12+阅读 · 2017年12月5日
TensorFlow实现神经网络入门篇
机器学习研究会
10+阅读 · 2017年11月19日
机器学习基础篇--监督学习经典案例(Python实现)
Python技术博文
8+阅读 · 2017年10月24日
机器学习(15)之支持向量机原理(一)线性支持向量机
机器学习算法与Python学习
6+阅读 · 2017年9月1日
机器学习(7)之感知机python实现
机器学习算法与Python学习
4+阅读 · 2017年7月23日
Top
微信扫码咨询专知VIP会员