把感知机组装在一起就是神经网络了?

2020 年 12 月 3 日 CSDN

作者 |  梁唐  编 | 张文
头图 | CSDN 下载自视觉中国
来源 | TechFlow(ID:techflow2019)


神经网络与感知机的不同

这张图是一个多层感知机的图,乍一看没什么问题,但是细想会觉得有点奇怪,好像我们印象里看到的神经网络的图片也是这样的,既然如此,那么它们之间有什么区别呢?

表面上最明显的区别就是名字不同,这是一张神经网络的图片。

我们发现同样是三层,但是它每一层的名字分别是输入层、中间层(隐藏层)和输出层。我们一般把输入层和输出层单独命名,中间的若干层都叫做隐藏层或者是中间层。当然像是感知机一样,以数字来命名层数也是可以的,比如下图当中的输入层叫做第0层,中间层叫做第1层,最后输出层叫做第2层。

我们一般不把输出层看作是有效的神经网络,所以下图的网络被称为二层神经网络,而不是三层神经网络。

除了名字的叫法不同之外,还有一个最关键的区别就是激活函数,为了说明白这点,我们先来看看神经网络当中的信号传递。


信号传递


下图是一张我随便找来的神经网络图,我们可以看到输入的第一个节点被置为了1。这样做是为了方便引入偏移量,只是我们一般情况下画图的时候,不会特意把偏移量画出来。我们以下图为例子来看下神经网络当中信号的传递方式。



我们以 为例,可以来试着写出 的表达式,它一共有三个input,分别是1, , ,然后我们也可以看到每一个input对应的权重,所以最后 可以写成:


到这里还没有结束。神经网络当中每一层都会有对应的激活函数。一般情况下同一层网络当中的激活函数相同,我们把它叫做h,所以最终 这个节点的输出并不是刚刚得到的 ,而是


激活函数我们已经比较熟悉了,之前介绍过很多次,常用的大概有以下几种:
Relu、Sigmoid、tanh、softmax,以及一些衍生出的变种

一般情况下,在输出层之前我们通常使用Relu,如果模型是一个分类模型,我们会在最后使用Sigmoid或者是softmax,如果是回归模型则不使用任何激活函数。

Sigmoid我们已经很熟悉了,如果我们把LR模型也看成是一个单层的神经网络的话,那么Sigmoid就是它的激活函数。Sigmoid应用在二分类场景当中单个的输出节点上,输出的值 如果大于0.5表示为真,否则为假。在一些概率预估场景当中,也可以认为输出值就代表了事件发生的概率。

与之对应的是softmax函数,它应用在多分类问题当中,它应用的节点数量不是1个,而是k个。这里的k表示多分类场景当中的类别数量。我们以k=3举例,看下图:

在图中一共有三个节点,对于每一个节点来说,它的公式可以写成:



其实和Sigmoid的计算方式是一样的,只不过最后计算了一个权重。最后我们会在这k个节点当中选择 最大的作为最终的分类结果。


代码实现


最后,我们来试着写一下神经网络的代码,由于现在我们还没有介绍神经网络的训练方法,所以我们只能实现它预测的部分。等我们介绍完了反向传播算法之后,再来补上模型训练的过程。

如果不考虑反向传播的话,其实整个算法的代码非常简单,只要熟悉Python语法的同学都能看懂。

import numpy as np
def relu(x): return np.where(x > 0, x, 0)

def sigmoid(x): return 1 / (1 + np.exp(-x))

class NeuralNetwork(): def __init__(self): self.params = {} self.params['W1'] = np.random.rand(2, 3) self.params['b1'] = np.random.rand(1, 3) self.params['W2'] = np.random.rand(3, 2) self.params['b2'] = np.random.rand(1, 2) self.params['W3'] = np.random.rand(2, 1) self.params['b3'] = np.random.rand(1, 1) def forward(self, x): a1 = np.dot(x, self.params['W1']) + self.params['b1'] z1 = relu(a1) a2 = np.dot(z1, self.params['W2']) + self.params['b2'] z2 = relu(a2) a3 = np.dot(z2, self.params['W3']) + self.params['b3'] return np.where(sigmoid(a3) > 0.5, 1, 0) if __name__ == "__main__": nn = NeuralNetwork() print(nn.forward(np.array([3, 2])))


更多精彩推荐

  常年“盘踞”数据库前五的 MongoDB,在中国有哪些新动向?

  ☞开发者实测 M1 芯片报告:除了大型应用程序启动慢点,整体性能优秀

  ☞她们,在字节跳动写代码

  ☞“跟风离职后,找不到工作了!”:好多同事离职,这家公司还值不值得待?

  ☞中招!330 万台老年机被植木马,背后黑幕细思极恐

  ☞Salesforce 为什么要收购 Slack?

 ☞中台“不火”了,企业数智转型如何破圈?

      
      
        
点分享
点点赞
点在看
登录查看更多
0

相关内容

感知机在机器学习中,感知机是一种二进制分类器监督学习的算法。二值分类器是一个函数,它可以决定输入是否属于某个特定的类,输入由一个数字向量表示。它是一种线性分类器,即基于线性预测函数结合一组权值和特征向量进行预测的分类算法。
专知会员服务
46+阅读 · 2020年12月2日
【NeurIPS 2020】依图推出预训练语言理解模型ConvBERT
专知会员服务
11+阅读 · 2020年11月13日
神经网络的拓扑结构,TOPOLOGY OF DEEP NEURAL NETWORKS
专知会员服务
31+阅读 · 2020年4月15日
神经网络与深度学习,复旦大学邱锡鹏老师
专知会员服务
117+阅读 · 2019年9月24日
激活函数还是有一点意思的!
计算机视觉战队
12+阅读 · 2019年6月28日
深度学习必须理解的25个概念
机器学习算法与Python学习
5+阅读 · 2018年6月7日
深度学习入门必须理解这25个概念
AI100
7+阅读 · 2018年6月6日
一起读懂传说中的经典:受限玻尔兹曼机
算法与数学之美
4+阅读 · 2018年5月12日
基础 | GRU神经网络
黑龙江大学自然语言处理实验室
27+阅读 · 2018年3月5日
通俗理解卷积神经网络(小学生都能看懂)
七月在线实验室
9+阅读 · 2018年1月25日
理解神经网络的激活函数
论智
7+阅读 · 2018年1月8日
神经网络bp算法推导
统计学习与视觉计算组
11+阅读 · 2017年11月17日
干货|浅谈神经网络中激活函数的设计
机器学习研究会
5+阅读 · 2017年10月28日
神经网络中的「注意力」是什么?怎么用?
北京思腾合力科技有限公司
17+阅读 · 2017年10月28日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Arxiv
22+阅读 · 2018年2月14日
Arxiv
5+阅读 · 2017年11月13日
Arxiv
4+阅读 · 2015年8月25日
VIP会员
相关资讯
激活函数还是有一点意思的!
计算机视觉战队
12+阅读 · 2019年6月28日
深度学习必须理解的25个概念
机器学习算法与Python学习
5+阅读 · 2018年6月7日
深度学习入门必须理解这25个概念
AI100
7+阅读 · 2018年6月6日
一起读懂传说中的经典:受限玻尔兹曼机
算法与数学之美
4+阅读 · 2018年5月12日
基础 | GRU神经网络
黑龙江大学自然语言处理实验室
27+阅读 · 2018年3月5日
通俗理解卷积神经网络(小学生都能看懂)
七月在线实验室
9+阅读 · 2018年1月25日
理解神经网络的激活函数
论智
7+阅读 · 2018年1月8日
神经网络bp算法推导
统计学习与视觉计算组
11+阅读 · 2017年11月17日
干货|浅谈神经网络中激活函数的设计
机器学习研究会
5+阅读 · 2017年10月28日
神经网络中的「注意力」是什么?怎么用?
北京思腾合力科技有限公司
17+阅读 · 2017年10月28日
Top
微信扫码咨询专知VIP会员