Neural Network——神经网络

1.feature reusing——特征复用

1.1 什么是特征复用

        回顾我们之前所学习的模型,本质上都是基于线性回归,但却都可以运用于非线性相关的数据,包括使用了如下方法

  • 增加更多的特征
  • 产生新的特征(多项式回归)
  • 核函数

        在本身的维度找不到线性决策边界,但通过非线性转换将特征映射到高维空间在某个高纬度空间可以找到一个线性决策边界,同时它对应着其本身的维度的非线性决策边界。如下图示例

        我们可以多次进行这样的转换,以实现更好(更稳健)的决策边界,这种技术称为特征复用,神经网络就是特征重用思想的一种实例化。

1.2 为什么需要特征复用

        假设我们希望训练一个模型来识别识别一张图片上是否是一辆汽车,一种方法是我们利用很多汽车的图片和很多非汽车的图片,然后利用这些图片上一个个像素的值来作为特征。

        假如我们只选用灰度图片,每个像素则只有一个值,我们可以选取图片上的两个不同位置上的两个像素,然后训练一个逻辑回归算法利用这两个像素的值来判断图片上是否是汽车

        假使我们采用的都是50x50像素的小图片,则会有2500个特征,如果我们要进一步将两两特征组合构成一个多项式模型,则会有约25002/2个(接近3百万个)特征。普通的逻辑回归模型,不能有效地处理这么多的特征,计算量非常的大

        

问题:

  • 特征很敏感,例如同一辆汽车,一张照片在不同时间、不同环境下拍摄出来的照片都不一样;这样导致模型不具有鲁棒性
  • 特征维度过高,计算量非常的大

鲁棒性(Robustness)指的是一个模型对于数据中的噪声、异常值或其他干扰因素的抵抗能力,可以理解为低方差

通过特征复用,可以让特征不会处于如此高维空间,而且具有更好鲁棒性

2.Neural Network

2.1 神经网络的结构

       特征向量X进入一个神经元后,先经过一次线性变换,然后再通过一个激活函数(activation function)进行非线性变换得到输出

        回顾逻辑回归的结构,(Sigmoid就是逻辑回归的激活函数)

        

        相当于只有一个神经元,于是我们将其拓展,使用更多的神经元,,并且输入数据X=[x_{1},x_{2},x_{3}]^{T}与每个神经元都进行连接,我们就可以得到一个简单的三层神经网络,这就是它比线性回归和逻辑回归强的原因

                

        

        这个神经网络共有三层,第一层也叫输入层第二层也叫隐藏层(除了输入层和输出层都叫隐藏层,因为在训练时我们只能看见输入和输出),最后一层为输出层

        输入的每一个x均和每个神经元进行连接,故这种结构的隐藏层也叫全连接层。[a_{1},a_{2},a_{3}]^{T}也叫原始输入数据的特征向量。像这种传输从输入到输出单方向的神经网络也叫前馈神经网络(feedforward network)

        如今的神经网络包含若干隐藏层,每个隐藏层都包含若干个神经元,输出层的大小也和想要实现的任务有关。越深层的网络能拟合越复杂的函数,学习到对象更本质的特征。

2.2 前向传播(forward propaganda)的计算过程

        以这个网络结构为例

        其中x_{0}的值恒为1,相当于偏置项,其中a_{0}^{1}的值恒为1,相当于偏置神经元,则其不参与这层的输入计算,不画出也可以,那么偏置参数b向量就和权重参数\theta在同一个神经元里。

        根据逻辑回归的模型来说,如果X=[x_{0},x_{1},x_{2},x_{3}]^{T}()连接一个神经元就会对应有四个权重(其中一个与x_{0}相乘为偏置项),这些参数存储在神经元中,如果a_{1}^{1}对应的为\theta _{1}^{1}=[\theta _{10}^{1},\theta _{11}^{1},\theta _{12}^{1},\theta _{13}^{1}],那么我们就可以得到隐藏层权重如下表示,隐藏层输入为1×3,输出为3×3,所以权重矩阵大小为3×3

                                \theta ^{1}=[\theta _{1}^{1},\theta _{2}^{1},\theta _{3}^{1}]=\begin{bmatrix}\theta_{10}^1,\theta_{20}^1,\theta_{30}^1\\\theta_{11}^1,\theta_{21}^1,\theta_{31}^1\\\theta_{12}^1,\theta_{22}^1,\theta_{32}^1\\\theta_{13}^1,\theta_{23}^1,\theta_{33}^1\end{bmatrix}

        第i列分别对应着a_{i}^{1}

        假设激活函数用\sigma()表示,我们可以得到隐藏层的输出

        

        如果写成矩阵的形式

        

  • 通常只有一行的行向量都会写成列向量
  • 通常是参数矩阵转置后与输入相乘

        接着对于输入层输入来说,也有\theta ^{2}权重矩阵,输入为4×1(这里加上了偏置神经元),输出为1×1,所以权重矩阵大小为4×1(\theta ^{2}转置后变成行向量1×4与输入相乘)

        \theta ^{2}=[\theta _{10}^{2},\theta _{11}^{2},\theta _{12}^{2},\theta _{13}^{2}]^{T}

        于是我们可以得到这个神经网络最终输出

        

…………………………………………………………………………………………………………………

来看一个更复杂的网络结构       

        这是一个实现手写体数字识别神经网络,包含二个隐藏层,都为全连接结构,神经元个数分别为1000,2000,最后输出层为大小为10,对应给出10个数字概率

        输入手写体数字图片大小为28*28(这是一个黑白图,所以只有一个颜色通道),该图片会展平成784*1作为输入。那么根据输入大小与输出大小还有矩阵乘法我们可以得到,第一个隐藏层权重矩阵a^{1}大小为784*1000

        

        同样的第二个隐藏层权重矩阵a^{2}大小为1000*2000

        输出层权重矩阵大小为1000*10,此外为了实现多分类,在最后使用了Softmax函数

        假设网络预测这个输入为数字“9”,那么最终的输出≈[0,0,0,0,0,0,0,0,1](相当于one-hot编码)

2.3 为什么神经网络可以拟合非线性数据

        假设我们有这样一个异或问题(XOR),输入数据为一对二进制编码,相异输出1,相同输出0,如下图。异或问题就是一个经典的非线性问题,我们无法使用一个直线来完全分开这两类数据

                                

        当然我们可以使用曲线将其分开

                        

        当然同或(XNOR)是类似的,同或会在输入相同才输出1,相异输出0

        接下来我们使用一个简单神经网络就可以解决这个问题,在解决异或问题先,我们先解决别的问题

1.与(and)操作

        与操作只有当输入都为1时,才会输出1,否则为0  

        我们可以构建这样一个结构就可以实现与操作,使用sigmoid作为激活函数,假设网络通过学习得到了参数组为

        

        

        输入不同的组合,可以看到是正确的

        

2.或(or)操作

        或操作只要输入有一个1,那么就会输出1

        同样的

        假设网络通过学习得到了参数组为

        

                

3.非(not)操作

        非操作会将输入置反

         假设网络通过学习得到了参数组为

        

                        

4.异或

        我们可以将这几个结构进行组合

        构建一个两层的神经网络

        假设通过学习得到了图上的参数,我们就可以解决同或问题

        

        对于异或结构是一样的,在学习时改变输入对应输出的标签就行,学习到不一样的参数组。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        

2.4 反向传播(backpropagation

        神经网络中的参数并不是随机的,而是和之前学习的模型一样需要通过训练数据学习,这样这些参数才有意义。为此我们需要计算各参数梯度,神经网络通过前向传播从输入到输出,通过反向传播从后往前计算传回参数梯度\frac{\partial J(\boldsymbol{\theta})}{\partial\boldsymbol{\theta}_{ij}^l}

        假设我们有这样一个网络结构

        ​​​​​​​                ​​​​​​​

        各层输入输出如下

                ​​​​​​​

反向传播基于链式求导法则

        假设损失函数表示为\mathcal{L}=-y\log\left(h_{\theta}(x)\right),激活函数\sigma为sigmoid

(待更新)

2.5 激活函数

        引入非线性激活函数后,使网络可以逼近任意非线性函数。如果不加上激活函数,虽然有多层网络,多神经元,但所有线性变换的叠加仍然是线性函数。

常见的激活函数有:Relu函数、sigmoid函数以及tanh函数。

1. Relu函数

        

Relu(x) = max(x,0),计算非常简单

其导函数图像为:

        

不存在梯度消失现象。因此ReLU比起其他几个更常用

2. Sigmoid函数

    

Sigmoid函数可以将输入的任何值映射到(0,1)。注意,当输入接近0时,sigmoid函数接近线性变换

导函数图像如下:

               

        当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0(饱和区梯度消失现象),此时不利于参数更新。

3. tanh函数(双曲正切函数)

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

tanh函数可以将输入的任何值映射到(-1,1)

        ​​​​​​​    

        注意,当输入在0附近时,tanh函数接近线性变换。 函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称

导函数图像如下图所示:

        ​​​​​​​      

        当输入接近0时,tanh函数的导数接近最大值1。同样存在饱和区梯度消失现象。              

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285626.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#深拷贝效率对比

对于浅拷贝和深拷贝,前面的文章已经说明了。 C#浅拷贝和深拷贝数据-CSDN博客 本篇说一下,深拷贝的效率问题,效率一直是程序追求的,效率越高肯定越好,有时候功能是实现了,但是运行以及处理数据的效率非常低…

Ubuntu 18.04配置NFS服务器以及配置时遇到NFS问题

1.安装相关软件 sudo apt-get install nfs-kernel-server sudo apt-get install nfs-common 2.配置共享目录 2.1修改exports文件 sudo vi /etc/exports在最后添加如下并保存退出 /home/xiaowu/nfs 192.168.31*(rw,sync,no_root_squash,no_subtree_check) /home/xiaowu/nfs…

【密码学】群的证明(习题)

0.前置知识 1.习题 记录一次密码学作业~群的判定 2.求解

〖大前端 - 基础入门三大核心之JS篇(57)〗- 继承

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

骨传导耳机和气传导耳机有什么区别?谁更值得入手?

先说答案,骨传导耳机和气传导耳机的佩戴方式和传声方式不同,并且骨传导耳机相比于气传导耳机更值得入手。 一、骨传导耳机和气传导耳机有什么区别 1、佩戴方式不同 骨传导耳机采用一体式耳挂佩戴或耳夹式佩戴,气传导耳机采用分体式耳挂设计…

采样率8kHz~96kHz单端输入ADC芯片CJC1808

音频模/数转换器是一种用于将模拟音频信号转换成数字信号的设备,可以提供高质量的音频转换功能;被广泛应用于录音室、数字音频处理、混音、模拟音频处理等应用中;是当今数字音频处理中不可或缺的一部分。 ADC芯片可以提供宽频带的模拟输入&a…

SpringCloud微服务 【实用篇】| Docker镜像、容器、数据卷操作

目录 一:Docker基本操作 1. 镜像操作 镜像相关命令 2. 容器操作 容器相关命令 3. 数据卷(容器数据管理) 数据卷 操作数据卷 挂载数据卷 挂载的方式区别 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂&#xff0…

如何利用CHAT写C程序?

问CHAT&#xff1a;用c语言编写在二维字符数组中查找某个字符串 CHAT回复&#xff1a;以下是一个简单的C程序&#xff0c;它将在二维字符数组中查找特定的字符串。 c #include <stdio.h> #include <string.h> void search(char arr[100][100], int r, char* str) …

Java泛型(1)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

xxl-job 分布式调度学习笔记

1.概述 1.1什么是任务调度 业务场景&#xff1a; 上午10点&#xff0c;下午2点发放一批优惠券 银行系统需要在信用卡到期还款日的前三天进行短信提醒 财务系统需要在每天凌晨0:10分结算前一天的财务数据&#xff0c;统计汇总 不同系统间的数据需要保持一致&#xff0c;这时…

构建健康中国:医保支付购药系统的技术实现

在数字化时代&#xff0c;医保支付购药系统的技术实现成为医疗保障体系不可或缺的一环。通过整合医疗资源、优化服务流程&#xff0c;这一系统为患者提供了更便捷、高效的医疗服务。本文将深入探讨医保支付购药系统的技术架构与实现方法。 1. 技术架构概述 医保支付购药系统…

利用台阶仪测量薄膜厚度的方法和技巧

在薄膜制备过程中&#xff0c;薄膜厚度是一个至关重要的参数&#xff0c;直接影响薄膜的性能和应用。为了准确测量薄膜厚度&#xff0c;研究者广泛使用台阶仪&#xff0c;这是一种方便、直接、准确的测量方法。本文将介绍如何利用台阶仪进行薄膜厚度测量的方法和技巧。 选择合…