神经网络入门——神经元算法

目前机器学习、深度学习在业界使用的越来越广泛,做为一个有着技术追求的it人,我觉得有必要学习和了解一下这块的知识,今天就从最简单的单层神经网络开始介绍。

在介绍人工神经网络之前,首先认知下神经元。

神经元

不知道大家还有印象这个图吗?这个是出现在我们生物课本中的一幅图。

一个神经元的组成基本就是上图这些东西组成。

通常一个神经元具有多个树突,主要用来接受传入信息信息,信息通过轴突传递进来后经过一系列的计算(细胞核)最终产生一个信号传递到轴突,轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。这个连接的位置在生物学上叫做“突触”。

也就是说一个神经元接入了多个输入,最终只变成一个输出,给到了后面的神经元,那么基于此,我们尝试去构造一个类似的结构。

结构

神经元的树突我们类比为多条输入,而轴突可以类比为最终的输出。

这里我们构造一个典型的神经元模型,该模型包含有3个输入,1个输出,以及中间的计算功能。

注意在每一个输入的“连接”上,都有一个对应的“权值”。

说个通俗的例子来理解下权值。比如今天你要决定今是否要去看电影,可能要考虑这3个因素: 1、女朋友有没有时间,2、有没有好看的电影,3、今天工作忙不忙; 而这三个因素对于每个人来说权重都是不同的,因为有的人看重工作、有的人看重家人,不同的权重最终的结果也会不一样。

因此权重的大小是比较关键的。而一个神经网络的训练算法就是让权重的值调整到最佳,以便使得整个网络的预测效果最好。

接下里,我们用数学的方式来表示一下神经元,我们定义 w为权重,x为输入

$$ w = \begin{bmatrix} w_{1}  \\  ... \\ w_{m} \end{bmatrix} ,  x = \begin{bmatrix} x_{1}  \\  ... \\ x_{m} \end{bmatrix}$$

$$ z = w_{1} * x_{1}  + ... + w_{m} * x_{m} $$

z输入的总和,也就是这两个矩阵的点乘,也叫内积。这里补充点数学知识。

?$$ z = w_{1} * x_{1}  + ... + w_{m} * x_{m} = \sum\limits_{j=1}^{m} w_{j} * w_{j} = w^{T}*x $$

$w^{T}$代表矩阵的转置,即将列转未行,举个例子:

$$  \begin{bmatrix}  1 & 2 & 3 \end{bmatrix} * \begin{bmatrix} 4 \\  5 \\ 6 \end{bmatrix} = 1*4 + 2*5 + 3*6 $$

激活函数

当信息到达计算完成之后,这个值不会直接传递给下一层,而是需要经过一个激活函数,将激活函数的值传递给下一层。

$\phi$(z) = { 1  if  z>=θ;   -1  otherwise 

注意这里有一个阈值 θ ,阈值的确定也需要在训练过程中进行完成。

那么如何进行训练,这里的我们需要用到感知器(preceptron)算法,具体过程分为下面这么几个步骤:

1、首先将权重向量w进行初始化,可以为0或者是[0,1]之间的随机数;

2、将训练样本输入感知器(计算内积后输入激活函数得到最终结果),最后得到分类的结果(结果为1 或 -1);

3、根据分类的结果再次更新权重向量w;

前面提到激活函数是当z值大于一定的阈值? θ 后,才进行激活或者不激活。因此为了计算方便呢,我们再多加入一组向量,w0 和 x0 ,w 取 -θ ,x0 取 1;将其放到等式左边,这样当 z>0 的时候 激活函数输出 1,而 z<0 激活函数输出 -1。

$$ z = w_{0} * x_{0} + w_{1} * x_{1}  + ... + w_{m} * x_{m} $$

$\phi$(z) = { 1  if  z>=0;   -1  otherwise 

权重更新

好,前面所有的准备都已经完成,接下来我们看下刚才提到的第三步,权重向量的更新,其实也就是神经网络训练的过程:

权重的更新每一轮迭代  Wj = Wj+ ? ▽Wj

而 ▽Wj = η * ( y - y‘ ) * Xj

上式中 η 叫做学习率,是[0, 1]之间的一个小数,由我们自己定义;y是真实 的样本分类,而 y’ 是感知器计算出来的分类。

我们可以简单推导一下,当 y 和 y‘ 相等,?▽Wj 的值为0,Wj则不会更新。对应的意义就是真实和预测的结果是相同的,因此权重也不需要再更新了。

这里举个例子 :

假设初始化 W = [ 0, 0, 0] , X = [1, 2, 3],  假设定义 η = 0.3,y = 1,y‘ = -1

▽W(1) = 0.3 * (1 - (-1)) * X(1) = 0.3*2*1 = 0.6;      W(1) = W(1) + ▽W(1) = 0.6;

▽W(2) = 0.3 * (1 - (-1)) * X(2) = 0.3*2*2 = 1.2;      W(1) = W(1) + ▽W(1) = 1.2;

▽W(3) = 0.3 * (1 - (-1)) * X(3) = 0.3*2*3 = 1.8;      W(1) = W(1) + ▽W(1) = 1.8;

更新之后的向量 w = [0.6, 1.2, 1.8]  然后接着继续计算,更新。

阈值更新

前面提到,我们将阈值经过变换后变成了 w0,再每一轮的迭代训练过程中,w0也需要跟着一起更新。

最初w0 也需要初始化为0,因为x0等于1,因此 ▽W(0) = η * ( y - y‘ ) ;

这里很多人可能会和我开始有一样的疑惑,阈值不是提前定义好的吗?其实不是的,这里不断的迭代,其实就是阀值计算的过程,和权重向量一样,最终都是通过一轮一轮更新计算出来的,由于一开始我们设定的w0 = - θ,所以当最终我们的阀值更新出来后,-w0 就是我们学习出来的阀值。

看到上面的过程是否有些晕,从整体上看,其实就是这样一个过程:

初始化权重向量和阈值,然后计算预测结果和真实结果是否存在误差,有误差就根据结果不断的更新权重,直到权重计算的结果最终达到最佳,权重的值就是我们学习出的规律。

感知器目前的适用场景为线性可分的场景,就是用一条直线可以分割的二分类问题。

用python实现了上述过程,可以看下:

#-*- coding:utf-8 -*-
# 简单神经网络 感知器

import numpy as np

reload(sys)
sys.setdefaultencoding("utf-8")

class Perception(object):
    ‘‘‘
    eta: 学习率 η
    time: 训练次数
    w_: 权重向量

    ‘‘‘
    def __init__(self, eta = 0.01, time=10):
        self.eta = eta
        self.time = time
        pass

    ‘‘‘
    输入训练数据,X为输入样本向量,y对应样本分类
    X:shape[n_samples, n_features]
    X:[[1,2,3], [4,5,6]]
    n_samples : 2
    n_features: 3
    y:[1, -1]
    ‘‘‘
    def fit(self, X, y):
        # 初始化权重向量为0,加一为w0,也就是损失函数的阈值
        self.w_ = np.zero[1 + X.shape[1]]
        self.errors_ = []

        for _ in range(self.time):
            errors = 0
            # x:[[1,2,3], [4,5,6]]
            # y:[1, -1]
            # zip(X,y) = [[1,2,3,1], [4,5,6.-1]]
            for xi, target in zip(X, y):
                # update = η * ( y - y‘ )
                update = self.eta * (target - self.predict(xi))

                # xi 为向量, 这里每个向量都会乘
                self.w_[1:] += update * xi
                self.w_[0] += update;

                errors += int(update != 0.0)

        pass

    # 损失函数
    def predict(self, X):
        # z = w1*x1+...+wj*xj + w0*1
        z = np.dot(X, self.w_[1:]) + self.w_[0]
        # 损失函数
        if z >= 0.0:
            return 1
        else:
            return -1
        

原文地址:https://www.cnblogs.com/by-dream/p/10497816.html

时间: 2024-10-12 04:23:56

神经网络入门——神经元算法的相关文章

反向传播神经网络入门

http://www.hankcs.com/ml/back-propagation-neural-network.html 单个神经元 神经网络是多个"神经元"(感知机)的带权级联,神经网络算法可以提供非线性的复杂模型,它有两个参数:权值矩阵{Wl}和偏置向量{bl},不同于感知机的单一向量形式,{Wl}是复数个矩阵,{bl}是复数个向量,其中的元素分别属于单个层,而每个层的组成单元,就是神经元. 神经元 神经网络是由多个"神经元"(感知机)组成的,每个神经元图示如

人工神经网络入门(4) —— AFORGE.NET简介

范例程序下载:http://files.cnblogs.com/gpcuster/ANN3.rar如果您有疑问,可以先参考 FAQ 如果您未找到满意的答案,可以在下面留言:) 0 目录人工神经网络入门(1) -- 单层人工神经网络应用示人工神经网络入门(2) -- 人工神经基本概念介绍人工神经网络入门(3) -- 多层人工神经网络应用示例人工神经网络入门(4) -- AForge.Net简介 1 介绍这篇文章中,我们将介绍一个用C#实现的框架AForge,利用这个框架,您可以方便地操作人工网络,

神经网络入门介绍(非常易懂)

//2019.09.10神经网络入门与学习1.神经网络的发展主要得益于三个方面的进步:(1)2进制的创新能力的发展(2)软硬件能力的发展;(3)人的性价比的下降.2.神经网络的成熟应用目前主要体现在分类识别上,具体来说可以分类到三个方面:(1)图像识别:主要用于人脸识别和自动驾驶:(2)语音识别:主要用于语音助手等:(3)文本识别:主要用于字体识别和新闻文本推送等. 图13.神经网络的结构主要包括四个方面:(1)网络结构(2)激励函数(3)损失函数(4)梯度下降 4.神经网络的网络结构主要如下所

传统神经网络ANN训练算法总结 参考 。 以后研究

http://blog.163.com/yuyang_tech/blog/static/21605008320146451352506/ 传统神经网络ANN训练算法总结 2014-07-04 17:13:52|  分类: deeplearning |  标签:ann  |举报|字号 订阅 下载LOFTER我的照片书  | 原文来自:http://blog.csdn.net/bluebelfast/article/details/17139095 ——————————以下为原文——————————

传统神经网络ANN训练算法总结

传统神经网络ANN训练算法总结 学习/训练算法分类 神经网络类型的不同,对应了不同类型的训练/学习算法.因而根据神经网络的分类,总结起来,传统神经网络的学习算法也可以主要分为以下三类: 1)前馈型神经网络学习算法-----(前馈型神经网络) 2)反馈型神经网络学习算法------(反馈型神经网络) 3)自组织神经网络学习算法------(自组织神经网络) 以下我们将通过三类典型的神经网络模型分别阐述这三类不同的学习算法其区别与相似点. 虽然针对不同的网络模型,这里产生了三类不同类型的训练算法,但

神经网络入门游戏推荐BugBrain

今天看到一款神经网络入门游戏,BugBrain,在游戏中,你可以通过连接神经元,设置神经元阈值等建造虫子的大脑,让瓢虫.蠕虫.蚂蚁等完成各种任务.下载下来玩了玩,难度真不是入门级的= =!真心佩服作者的智商. 游戏官方主页 http://www.biologic.com.au/bugbrain/ (左下是蠕虫的大脑) (一个蚂蚁的大脑就如此复杂···) BugBrain游戏提供了一个非常不错的游戏地图编辑器,和测试平台.地图编辑器中玩家可以根据个人喜好,编辑你自己的虚拟世界,让你的小虫们生活在这

神经网络-前向算法

神经网络-前向算法 直观来看一波, 神经网络是咋样的. 多个输入: 首先进行归一化 神经元: 是一个抽象出来的概念, 多个输入的加权和 中间是各神经元, 以"层"的方式的 "映射" 输出了一个概率(向量) 前向算法 我们首先好奇的就是, 输入 --> 到输出是如何计算的, 看一波最简单的网络3层结构. 输入层: 即看到最左边的3个输入节点 线条: 权值, 图中的每根线条代表一个权值 隐含层: 输入节点的加权和(各节点) + 偏置(bias) A: 激活函数(

神经网络和BP算法C及python代码

以上仅给出了代码.具体BP实现原理及神经网络相关知识请见:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输出 层神经元个数.其中(1<n<=100,1<m<=1000, 1<p<=100, 1<t<=10). 随后为 m 行,每行有 n+1 个整数.每行代表一个样本中的 n 个特征值 (x 1 , x 2 ,..., x n ) 与样本的 实际观测结果 y.特征值的

【HowTo ML】分类问题-&gt;神经网络入门

非线性分类器(Non-linear hypotheses) 为什么使用非线性分类器 我们举几个栗子: 假如我们有一个数据空间如左上角坐标系所示,那么我们要的模型需要如右边公式所示的预测函数. 假设有n个特征那么计算二次多项式就有O(n^2)的复杂度.n能有多大?我们来看下面这个栗子. 假设我们需要识别汽车,假如选取图像上两个点,那么就如左边坐标系所示,这没什么. 但实际上我们需要的数据空间时整张图片所有的像素.也就是假设图像是50?50那么我们就有2500个像素点.也就是需要2500个特征. 刚