一个故事看懂AI神经网络工作原理
我是一个AI神经元
我是一个AI神经元,刚刚来到这个世界上,一切对我来说都特别新奇。
之所以叫这个名字,是因为我的工作有点像人类身体中的神经元。

人体中的神经元可以传递生物信号,给它输入一个信号,它经过处理后再输出一个信号传递给别的神经元,最终传递到大脑完成对一个信号的决策和处理。
聪明的计算机科学家们受到启发,在代码程序里发明了我:神经元函数。
在我们的世界里,我只是普普通通的一员,像我这样的神经元有成百上千,甚至上万个,我们按照层的形式,组成了一个庞大的神经网络。

很快我和隔壁工位的大白开始混熟了,他比我来得早,对这里要熟悉的多。
听大白告诉我说,我们这个神经网络是一个图像识别的AI程序,只要给我们输入一张狗的照片,我们就能告诉你这是一只柯基,还是泰迪、柴犬、二哈···
神经元结构
在大白的指引下,我很快就学会了怎么工作。
虽然我们叫神经元,名字听起来挺神秘的,但实际上我就是一个普通函数,有参数,有返回值,普通函数有的我都有:
def neuron(a):
  w = [...]
  b = ...
  ...
我有一个参数a,这个参数是一个数组,里面的每一个元素我把它分别叫做a1,a2,a3···用这个a来模拟我这个神经元收到的一组信号。
人类的神经元是怎么处理输入的生物信号我不知道,我估计挺复杂的。但在我这里就很简单:我给每一个输入值设定一定的权重,然后做一个简单的加权求和,最后再加上一个偏移值就行啦!
所以我还有一个数组叫做w,就是权重weight的意思,里面的每一个元素我叫做w1,w2,w3···,至于那个偏移值,就叫它bias。
如此一来我的工作你们也该猜到了,就是把传进来的a里面的每个元素和w里的每一个元素做乘法,再加起来,最后加上偏移值,就像这样:

说到这里,我突然想到一个问题,打算去问问大白。
“大白,这些要计算的数据都是从哪里来的呢?”
“是上一层的神经元们送过来的”
“那他们的数据又是哪来的呢?”,我刨根问题的问到。
大白带我来到了门口,指向另外一个片区说到,“看到了吗?那里是数据预处理部门,他们负责把输入的图片中的像素颜色信息提取出来,交给我们神经网络部门来进行分析。”
“交给我们?然后呢”

“咱们这个神经网络就像一台精密的机器,我们俩只是其中两个零件,不同的权重值某种意义上代表了对图片上不同位置的像素关心程度。一旦开动起来,喂给我们图片数据,我们每一个神经元就开始忙活起来,一层层接力,把最终的结果输出到分类器,最终识别出狗的品种。”
神经网络训练
正聊着,突然,传来一阵广播提示音,大家都停止了闲聊,回到了各自工位。

“这是要干啥,这么大阵仗?”,我问大白。
“快坐下,马上要开始训练了”,大白说到。
“训练?训练什么?”
“咱们用到的那些权重值和偏移值你以为怎么来的?就是通过不断的训练得出来的。”
还没说到几句话,数据就开始送过来了。按照之前大白教给我的,我将输入数据分别乘以各自的权重,然后相加,最后再加上偏移bias,就得到了最后的结果,整个过程很轻松。
我准备把计算结果交给下一层的神经元。
大白见状赶紧制止了我,“等一下!你不能直接交出去”
“还要干嘛?”
大白指了一下我背后的另一个家伙说到:“那是激活函数,得先交给他处理一下”
“激活函数是干嘛的?”,我问大白。
“激活,就是根据输入信号量的大小去激活产生对应大小的输出信号。这是在模仿人类的神经元对神经信号的反应程度大小,好比拿一根针去刺皮肤,随着力道的加大,身体的疼痛感会慢慢增强,差不多是一个道理。”
听完大白的解释,我点了点头,好像明白了,又好像不太明白。
后来我才知道,这激活函数还有好几种,经常会打交道的有这么几个:
- sigmoid
- tanh
- relu
- leaky relu

激活函数处理完后,总算可以交给下一层的神经元了,我准备稍事休息一下。
刚坐下,就听到大厅的广播:

随后,又来了一组新的数据,看来我是没时间休息了,赶紧再次忙活了起来。
这一忙不要紧,一直搞了好几个小时,来来回回重复工作了几万次,我都快累瘫了。
损失函数 & 优化方法
趁着休息的空当,我又和大白聊了起来。
“大白,刚刚咱们这么来来回回折腾了几万次,这是在干啥啊?”
大白也累的上气不接下气,缓了缓才说到:“这叫做网络训练,通过让我们分析大量不同品种狗的图片,让我们训练出合适的权重和偏移值,这样,我们就变得会认识狗品种了,以后正式工作的时候给我们新的狗的图片,咱们也能用学到的知识去分辨啦"

“那到底是怎么训练的,你给我说说呗”,我继续问到。
“你刚才也看到了,广播里不断通知更新权重和偏移值。这训练就是通过不断的尝试修改每一层神经元的权重值和偏移值,来不断优化,找到最合适的数值,让我们对狗的种类识别准确率最好!”,大白说到。
“不断尝试修改?这么多神经元,难不成看运气瞎碰?”
大白给了我一个白眼,“怎么可能瞎试,那得试到猴年马月去了。咱们这叫深度学习神经网络,是能够自学习的!”
他这么一说我更疑惑了,“怎么个学习法呢?”
“其实很简单,咱们先选一组权重偏移值,做一轮图片识别,然后看识别结果和实际结果之间的差距有多少,把差距反馈给咱们后,再不断调整权重和偏移,让这个差距不断缩小,直到差距接近于0,这样咱们的识别准确率就越接近100%”

“额,听上去好像很简单,不过我还有好多问题啊。怎么去衡量这个差距呢?具体怎么调整权重偏移呢?调整幅度该多大好呢?”,我小小的脑袋一下冒出了许多的问号。
大白脸上露出了不可思议的表情,“小伙子,不错嘛!你一下问出了神经网络的三个核心概念。”
“是哪三个?快给我说说”
大白喝了口水,顿了顿接着说到,“首先,怎么去衡量这个差距?这个活,咱们部门有个人专门干这活,他就是损失函数,他就是专门来量化咱们的输出结果和实际结果之间的差距。量化的办法有很多种,你空了可以去找他聊聊”

“那第二个呢?”
“第二个,具体怎么调整,这也涉及到咱们神经网络中一个核心概念,他就是优化方法,咱们部门用的最多的是一个叫梯度下降的方法。那玩意儿有点复杂,一时半会儿给你说不清楚,大概差不多就是用求导数的方式寻找如何让损失函数的损失值变小”,大白继续耐心的解释着。

“好吧,那第三个核心概念是什么?”
“你刚不是问调整幅度吗?这个调整幅度太小了不行,这样咱们训练的太慢了,那得多训练很多回。太大了也不行,要是一不小心错过了那个最优值,损失函数的结果就会来回摇摆,不能收敛,所以有一个叫学习速率的数值,通常需要程序员们凭借经验去设定”
我还沉浸在大白的讲解中,广播声再次响起:

看来程序员修改了学习速率,我只好打起精神,继续去忙了,真不知道何时才能训练达标啊~
往期TOP5文章

一个故事看懂AI神经网络工作原理的更多相关文章
- 一个故事看懂HTTPS
		我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习. 为了不让别人看到浏览记录,主人选择了"无痕模式". 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什 ... 
- 一个故事看懂CPU的TLB
		Hi,我是CPU一号车间的阿Q,还记得我吗,真是好久不见了- 我所在的CPU是一个八核CPU,就有八个工作车间,那运行起来速度杠杆的- 虚拟地址翻译 一大早,我们一号车间MMU(内存管理单元)部门的小 ... 
- 一个故事看懂Linux文件权限管理
		前情回顾: 我通过open这个系统调用虫洞来到了内核空间,又在老爷爷的指点下来到了sys_open的地盘,即将开始打开文件的工作. 详情参见:内核地址空间大冒险:系统调用 open系统调用链 我是一个 ... 
- 一个故事看懂CPU的SIMD技术
		好久不见,我叫阿Q,是CPU一号车间的员工.我所在的CPU有8个车间,也就是8个核心,咱们每个核心都可以同时执行两个线程,就是8核16线程,那速度杠杠滴. 我所在的一号车间,除了负责执行指令的我,还有 ... 
- 一图看懂hadoop MapReduce工作原理
		MapReduce执行流程及单词统计WordCount示例 
- 一图看懂hadoop Yarn工作原理
		Hadoop 资源调度框架Yarn运行流程 
- zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
		首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于当前参数的梯度: 根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ... 
- 一个故事讲懂vue父子组件传值
		作者:李佳明同学链接:https://www.jianshu.com/p/2272b6ca0f0c 一个故事讲懂vue父子组件传值 讲故事前先讲代码 父组件向子组件传值 父组件数据传递给子组件可以通过 ... 
- 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
		Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ... 
随机推荐
- Thymeleaf中model设一个值 页面显示此值 JS取此值
			model设值: m.addAttribute("pageNo", pageNo); 页面显示值: 当前为第:<span th:text="${pageNo}&qu ... 
- Require.js中的路径在IDEA中的最佳实践
			本文主要讲述require.js在IDEA中路径智能感知的办法和探索中遇到的问题. 测试使用的目录结构:一种典型的thinkphp 6的目录结构,如下图. 现在我通过在 vue-a.js 中运用不同的 ... 
- Combine 框架,从0到1  —— 4.在 Combine 中使用计时器
			本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用计时器. 内容概览 前言 使用计时器执行周期性的工作 将计时器转换为计时 ... 
- liunx配置本地yum源和更新aliyun yum源
			1.挂载DVD光盘到/mnt 因为配置时候路径名里面不能有空格,否则不能识别 [root@ mnt]# mount /dev/cdrom /mnt [root@ mnt]# umount ... 
- JavaScript 伪Ajax请求
			伪Ajax 通过iframe以及form表单,可以实现伪Ajax的方式. 并且它的兼容性是最好的. iframe iframe标签能够获取一个其他页面的文档内容,这说明它内部肯定是发送了一个请求,并且 ... 
- 初等函数——指数函数(Exponential Function)
			一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R. 
- day51:django:dispatch&模板渲染&过滤器&标签&组件&静态文件配置
			目录 1.dispatch 2.模板渲染 3.过滤器 4.标签 5.组件 6.静态文件配置 dispatch 回顾:CBV对应的URL传参 urls.py url(r'^book/(\d+)/(\d+ ... 
- 预科班D2
			2020.09.08星期二 预科班D2 学习内容: 一.复习 1.平台: 平台=操作系统+计算机硬件 2.跨平台性 3.文件 文件是指操作系统提供给上层使用者操作硬盘的一种功能. 
- 设计模式 | Catalog设计模式,抵御业务方需求变动
			大家好,这是一个全新的专题--设计模式. 其实可以选择的专题还有好几个,为什么选择设计模式呢?原因也很简单,首先是设计模式简单.易学.干货的文章固然好,但是普适性往往不强.另外一个很重要的点就是设计模 ... 
- docker 搭建私有云仓库
			docker搭建私有仓库 registry私有仓库 下载docker-distribution软件包 yum install epel-release yum install docker-dis ... 
