神经网络入门-基础的不能再基础

网上有许多关于神经网络入门的文章,但几乎千篇一律,写了不少公式,说实话真的对初学者很不友好。从什么动物神经开始讲,然后画细胞图,神经图。。。。堆公式。总之看的很难受,当初我学的时候也是看了不少文章不少博客,用了很久才看懂。最近也有带人入坑的需求,本来打算找两篇文章给他看,奈何都觉得不是很适合。于是打算自己写一篇。(本文适合零基础)。

神经网络的本质

  1. 神经网络介绍
    一句话:利用历史特征数据x与结论数据y计算(专业点叫学习)得到一个y关于x的函数,进而当有新的x输入的时候就可以计算(预测)该x对应y的值。
    生活中有很多事情其实是有规律的,这些规律可能复杂也可能简单。其实神经网络就是用来发现这种规律的,掌握了这种规律我们就能对未知的事情做出预测。比如买西瓜的时候,才开始可能不知道如何选,只能乱选,不管瓜的色泽,根蒂,敲击声音这些,于是你可能运气好,买到好吃的,运气不好买到不好吃的,于是你天天买西瓜,并把这些数据记录下来就成了如下数据集:
    来自周志华-机器学习
    那这里面瓜的好吃与否跟着三个瓜的特征是不是有一定的关系呢,那我们想我们能不能造出一个公式来,当我们输入瓜的这三个特征,他就能告诉我们这个瓜是不是好瓜,于是我们想有如下的式子:

y = f(x,w)

其中x代表的输入的三个特征,w代表这个式子的所有参数,那如果我们能假设一个基本的算法,是不是这个式子中有了w的值就可以确定了,例如我们猜测:

y = w1x1+w2x2+w3x3

那是不是这个式子中的w确定了这个式子就定了呢,下一次有西瓜来了我们只需要输入x的值他就能自己给我们算出y的值来。其实这就是神经网络要做的事情,即:网络设计者通过自己的经验设计一个f函数,其中函数的参数w未知2,然后利用已知的历史数据,利用一定的算法就求解得到w,进而得到这个算式,从而用来预测未知的数据。

  1. 如何求参数
    一句话:梯度下降算法
    如果我们用1代表是好瓜,0代表不是好瓜。假设现在有训练数据(历史数据)x和其对应的y_True值,那我们是不是想让我们输入x得到的y_pred与y_True一样,这样最好了,换句话说y_Pred的值应该与y_True差距越小越好。那我们是不是可以用一个式子去衡量这两个值的差距呢,进而衡量这个网络(式子)的好坏呢,在这里我们把这个衡量网络好坏的式子叫做损失函数,比如在这里我们可以用两者之差的平方来做损失函数,加平方是为了替代绝对值,一般损失函数的值越小代表网络拟合的越好(当然可能会过拟合,这个先不用管),所以是不是现在我们的问题就变成了如下呢:
  1. 我们有数据历史:x,y_True
  2. 我们为了求x跟y的关系设计了一个函数y=f(w,x)
  3. 我们设计了一个损失函数loss=sum((y_True-y_Pred)^2)(这里为嘛加sum是因为我们一般不止一个x,也就是不止一个历史数据)
  4. loss值越小代表网络越好

那如何求呢?
其实是不是就是求解如下优化问题:

求w使得loss最小(不会打公式只能这么写了,实际就是一个argmin)

此时我们的x,y_True是已知的,那是不是这个网络y=f(w, x)中只有w一个参数呢,也就是其实loss函数中只有w一个参数呢,那是不是我们可以写成

loss =g(w,x, y_True),其中x,y_True已知

那是不是现在我们就可以在坐标轴上画一幅w跟loss的图了,这个图每个点的函数值都大于等于0 。而我们要做的就是找这个图中函数值最小的那个地方,那个地方对应的w值就是要求的。那如何求呢,其实就是用梯度下降算法,这里简单说一下步骤如下:

1.随机初始化一个w的值
2. 计算这个点的梯度方向gradient(w),(因为沿着梯度方向函数值下降的最快,高数内容,不懂可以装懂)
3. 更新w的值
w=w-lr* gradient(w) ,其中lr是一个系数,也叫学习率,就是为了给梯度加一个系数,是一个人为设置的常数。
重复2,3步骤,直到loss值降到一定的值后或到达指定的迭代步数后停止。

以上就是简单的梯度下降原理,给大家放个图吧。说白了就是图上随机初始化一个位置,然后你站在这个位置看看四周往哪里走你的海拔掉的快(梯度方向),找到了就往那边走一步,然后到了新的地方在看看你的新位置往哪个方向海拔掉的快,又继续沿着快的方向前进,这样就能到谷底了。

在这里插入图片描述
图中的θ就是参数w,J函数就是这里的loss函数。

神经网络的两大用处

  1. 回归
    就是利用历史数据拟合得到一个函数,这个函数一般的输出y是一个标量,这种一般用在预测连续的数据上,比如预测明天下雨的概率问题,一般拟合一个输出为0-1之间的函数。西瓜是好瓜的概率也可以用回归来实现。

  2. 分类
    顾名思义就是对事物进行分类,我们可以通过一些手段让他变得可以做分类,最简单的就是回归那里进行一下改造,比如预测明天是否会下雨,用1表示会,0表示不会,那么我们可以在上面的基础上将下雨概率大于0.5的直接让大变成1,小于0.5的直接变成0,于是就变成了一个二分类,当然现实中还有利用多输出来作为分类的,即输出是一个向量,向量的每一个维度值代表分为对应类别的概率,这里就不在叙述。

神经网络还需要点什么

在这里插入图片描述
如图我们上面构建的分西瓜的网络用图画出来其实是这样的,那这样的网络有什么缺点么,或者说他还缺点什么?可以看出这样的网络其实就是一个线性网络,他只是一些特征的线性组合,即在二维的空间里他就是一根直线,在多维空间就是多维空间的一个平面,但是现实生活中的数据一定是线性可分的么,显然不是,如下:

在这里插入图片描述
在这里插入图片描述
上图用一个线性函数就能分开,但是下图显然不可以。于是我们需要得到一些非线性函数,即我们要将线性函数掰弯。因此我们引入了激活函数(Activation function),如下展示的是几种常见的激活函数(图片来自百度百科,主要不会打公式哈哈),有了激活函数后,每次线性函数得到的y在经过一下激活函数就变得非线性了。即:

y=activation(f(w, x))

在这里插入图片描述

常见的网络

那除了上面的线性运算(也叫全连接网络),还有没有其他的运算方式呢,答案是有的。比如卷积神经网络(CNN),循环神经网络(RNN)等他们有着独特的运算方式,这里也就不展开说了,但是基本所有的网络结构都是由这些简单的网络组合搭建而来的。

总结

使用神经网络的一般步骤:

  1. 确定好输入输出数据即x,y(x,y不一定能直接得到可能要通过某种变化或处理)
  2. 搭建网络,即定义y=f(w,x)
  3. 确定损失函数loss
  4. 利用梯度下降算法求解w
  5. 在测试数据上测试网络性能

当然最难的第四步现在都有很多框架来帮你实现了,所以也不用自己求导,只需要将精力放在搭建网络以及处理数据上,所以入门神经网络还是很简单的。此外推荐入门用的深度学习框架,keras,pytorch。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值