统计建模与R语言全连接神经网络学院航空航天学院专业机械电子工程年级 2019级学生学号 19920191151134 学生姓名梅子阳一、绪论1、人工智能背景信息技术是人类历史上的第三次工业革命,计算机、互联网、智能家居等技术的普及极大地方便了人们的日常生活。
通过编程的方式,人类可以将提前设计好的交互逻辑交给机器重复且快速地执行,从而将人类从简单枯燥的重复劳动工作中解脱出来。
但是对于需要较高智能水平的任务,如人脸识别、聊天机器人、自动驾驶等任务,很难设计明确的逻辑规则,传统的编程方式显得力不从心,而人工智能(Artificial Intelligence,简称 AI)是有望解决此问题的关键技术。
随着深度学习算法的崛起,人工智能在部分任务上取得了类人甚至超人的智力水平,如围棋上 AlphaGo 智能程序已经击败人类最强围棋专家之一柯洁,在 Dota2 游戏上OpenAI Five 智能程序击败冠军队伍 OG,同时人脸识别、智能语音、机器翻译等一项项实用的技术已经进入到人们的日常生活中。
现在我们的生活处处被人工智能所环绕,尽管目前能达到的智能水平离通用人工智能(Artificial General Intelligence,简称 AGI)还有一段距离,但是我们仍坚定地相信人工智能的时代已经来临。
怎么实现人工智能是一个非常广袤的问题。
人工智能的发展主要经历过三个阶段,每个阶段都代表了人们从不同的角度尝试实现人工智能的探索足迹。
早期,人们试图通过总结、归纳出一些逻辑规则,并将逻辑规则以计算机程序的方式实现,来开发出智能系统。
但是这种显式的规则往往过于简单,并且很难表达复杂、抽象的概念和规则。
这一阶段被称为推理期。
1970 年代,科学家们尝试通过知识库加推理的方式解决人工智能,通过建庞大复杂的专家系统来模拟人类专家的智能水平。
这些明确指定规则的方式存在一个最大的难题,就是很多复杂、抽象的概念无法用具体的代码实现。
比如人类对图片的识别、对语言的理解过程,根本无法通过既定规则模拟。
为了解决这类问题,一门通过让机器自动从数据中学习规则的研究学科诞生了,称为机器学习,并在 1980 年代成为人工智能中的热门学科。
在机器学习中,有一门通过神经网络来学习复杂、抽象逻辑的方向,称为神经网络。
神经网络方向的研究经历了两起两落。
2012 年开始,由于效果极为显著,应用深层神经网络技术在计算机视觉、自然语言处理、机器人等领域取得了重大突破,部分任务上甚至超越了人类智能水平,开启了以深层神经网络为代表的人工智能的第三次复兴。
深层神经网络有了一个新名字:深度学习。
一般来讲,神经网络和深度学习的本质区别并不大,深度学习特指基于深层神经网络实现的模型或算法。
2、神经网络与深度学习将神经网络的发展历程大致分为浅层神经网络阶段和深度学习阶段,以2006 年为分割点。
2006 年以前,深度学习以神经网络和连接主义名义发展,历经了两次兴盛和两次寒冬;2006 年,Geoffrey Hinton 首次将深层神经网络命名为深度学习,他发现通过逐层预训练的方式可以较好地训练多层神经网络,并在 MNIST 手写数字图片数据集上取得了优于 SVM 的错误率,开启了第三次人工智能的复兴。
在论文中,Geoffrey Hinton 首次提出了 Deep Learning 的概念,这也是(深层)神经网络被叫作深度学习的由来。
2011 年,Xavier Glorot 提出了线性整流单元(RectifiedLinear Unit,简称 ReLU)激活函数,这是现在使用最为广泛的激活函数之一。
2012 年,8层的深层神经网络AlexNet 发布,并在图片识别竞赛中取得了巨大的性能提升,此后数十层、数百层、甚至上千层的神经网络模型相继提出,展现出深层神经网络强大的学习能力。
一般将利用深层神经网络实现的算法称作深度学习,本质上神经网络和深度学习可认为是相同的。
二、线性模型与优化1、神经元模型典型生物神经元结构1943 年,心理学家 Warren McCulloch 和逻辑学家 Walter Pitts 根据生物神经元(Neuron)结构,提出了最早的神经元数学模型,称为 MP 神经元模型。
该模型的输出f(x) = ℎ(g(x)),其中g(x) = ∑i xi, xi∈ {0,1},模型通过g(x)的值来完成输出值的预测,如图所示。
如果g(x) ≥ 0,输出为 1;如果g(x) < 0,输出为 0。
可以看到,MP 神经元模型并没有学习能力,只能完成固定逻辑的判定。
MP神经元模型1958 年,美国心理学家 Frank Rosenblatt 提出了第一个可以自动学习权重的神经元模型,称为感知机(Perceptron),如图 1.5 所示,输出值o与真实值之间的误差用于调整神经元的权重参数{w , w , … , w }。
Frank Rosenblatt 随后基于“Mark 1 感知机”硬件实现感知机模型,输入为 400 个单元的图像传感器,输出为 8 个节点端子,可以成功识别一些英文字母。
一般认为 1943 年~1969 年为人工智能发展的第一次兴盛期。
感知机模型2、神经元的线性模型假设神经元在传输信息的过程中,单个神经元中的输出与输入间存在线性变化,用线性方程来模拟这个过程:f(x) = wx + b其中w为信号的增益过程,b为信号的偏置过程;而当输入为向量形式x = [x1, x2, x3, … , xn ] T时,线性方程变为:f(x) = w1x1 + w2x2 + w3x3 + ⋯ + w n x n + b则单层神经元的线性模型如下图所示对于已知的多组数据点(x, y),将x作为数据的输入,而将y作为数据的真实标签,建立模型,通过输入x来预测真实标签y的值,这个过程可以视为一个朴素的决策过程。
3、回归问题从点集中找到距离所有点距离最短的直线问题,就是线性回归问题。
在R 语言中,线性回归几行代码便可实现:在神经网络中,我们常用梯度下降法来解决回归问题;梯度下降法将回归问题变为了优化问题,我们通过优化f(x) = wx + b中的参数w与参数b,使得均方函数的取值最小,在这里我们称之为损失函数,上述过程可以记为4、梯度下降函数及其梯度向量根据梯度的知识,梯度∇f总是向着函数值增大的方向前进,则梯度的反方向指向函数值减少的方向,则只需要按照x′ = x−η⋅ ∇f来迭代更新x′,就能获得越来越小的函数值,其中η用来缩放梯度向量,一般设置为某较小的值,如 0.01、0.001 等。
根据梯度下降算法,我们需要计算出函数在每一个点上的梯度信息:( ∂ℒ /∂w , ∂ℒ /∂b )。
我们来推导一下梯度的表达式,首先考虑∂ℒ/ ∂w,将均方差函数展开:经过化简后,最终有同理可推导出这意味着,我们只需要计算在每一个点上面的(wx(i) + b−y(i) ) ∙x(i)和(wx(i) + b−y(i) )值,平均后即可得到偏导数∂ℒ /∂w和∂ℒ /∂b。
最后根据之前的梯度下降方法:来实现w和b值的不断更新,最终达到优化网络参数的目的。
在python中,可以用如下代码实现直线的梯度下降法线性回归:import numpy as npimport matplotlib.pyplot as pltdef grad_w(xi, yi, w, b):return2*(w*xi + b - yi)* xidef grad_b(xi, yi, w, b):return2*(w * xi + b - yi)def erro_account(points, w, b):erros =0for i in range(len(points)):erros +=(1/len(points))*(w*points[i,0]+ b - points[i,1]) **2return errosdef final_grad_w(points, w, b):finalGrad_w =0for i in range(0, len(points)):finalGrad_w +=(grad_w(points[i,0], points[i,1], w, b)/len(points))return finalGrad_wdef final_grad_b(points, w, b):finalGrad_b =0for i in range(0, len(points)):finalGrad_b +=(grad_b(points[i,0], points[i,1], w,b)/len(points))return finalGrad_bdef main_runner(points, initial_w, initial_b, times_of_calc,learning_rate):w = initial_wb = initial_bfor i in range(times_of_calc):w_new = w - learning_rate * final_grad_w(points, w, b)b_new = b - learning_rate * final_grad_b(points, w, b)w = w_newb = b_newprint("After {0} times of calc, final w = {1}, b = {2}".format(times_of_calc, w, b))return[w, b]def visualize(points, w, b):x = np.linspace(0,100)y = w*x + bplt.figure()plt.xlabel('value of X')plt.ylabel('value of Y')plt.ylim(0,150)plt.xlim(0,100)plt.scatter(points[:,0], points[:,1], s=20, color='blue',label='points')plt.plot(x, y, label='Regression line', color='red')plt.legend()plt.show()if __name__ =="__main__":points = np.genfromtxt("data.csv", delimiter=",")answer_list =[0,0]print('the original erros = {0}'.format(erro_account(points, answer_list[0], answer_list[1])))answer_list = main_runner(points,0,0,1000,0.0001) print('erros = {0}'.format(erro_account(points, answer_list[0], answer_list[1])))visualize(points, answer_list[0], answer_list[1])经过1000次循环(Epoch)更新后,均方差(MSE)的大小从5565.11下降到了112.61,得到的回归线也与前文中R代码的结果基本一致。