github上的项目,跟着一起学习
项目地址 https://github.com/MLEveryday/100-Days-Of-ML-Code
Youtube频道3Blue1Brown中有精彩的视频介绍神经网络。这个视频提供了很好的解释,并使用手写数字数据集演示基本概念。
B站视频在这里(https://www.bilibili.com/video/av15532370)。
以下是视频笔记:
人脑能轻易的识别并不清晰的数字3
如果写一个程序,来完成这一工作
神经网络的变种:
卷积神经网络,擅于图像识别
长短期记忆网络,擅于语音识别
神经网络的原味版(多层感知器MLP)
名称来源:人的大脑结构
神经元,装有一个数字(0到1之间)的容器
很多个神经元,分别对应图像中的每个像素(28*28=784个),神经元中的数字(激活值)代表对应像素的灰度值(0纯黑,1纯白)
这些784个神经元组成了网络的第一层,
最后一层代表0-9这十个数字,这些激活值表示系统认为输入的图像对应着哪个数字的可能性
中间还有几层“隐含层”,大黑箱
神经网络工作时,上一层的激活值,决定下一层的激活值
处理机制,一层的激活值是通过怎样的运算,算出下一层的激活值
模拟生物钟神经元组成的网络
神经网络如何工作,在第一层输入784个灰度值,输出层最亮的神经元就是神经网络的“选择”
凭什么我们就觉得这种层状结构可以做到智能判断?
人在在识别数字时,是各个部分的组合
理想情况下,希望倒数第二层中的各个神经元,分别对应上一个笔画部件。
当输入一个9或8这种带圈的数字时,某一个神经元的激活值就会接近1.不特指某个圈,而是希望所有这种位于图像顶部的圆圈图案都能点亮这个神经元,这样,从第三层到输出层,只需要学习哪些部件能组合出哪个数字。
识别圆圈的任务可以拆分为更细微的问题,识别出细微的边
希望第二层的神经元,对应短边
不仅是数字识别,图像识别等很多识别工作都能像这样,拆分成小块
上一层的激活值,如何决定下一层的激活值:设计一个机制,把像素拼成短边,把短边拼成图案,
把图案拼成数字。
设计第二层的这一个神经元,能够正确识别出图像中的这块区域里,是否存在一条边。
需要知道这个网络的参数,应该如何调整网络上的旋钮开关,才能让它足以表示出,要么这种图案,要么别的像素图案,要么是几条边组合成圆圈的图案之类。
需要给这个歌神经元和第一层所有神经元间的每一条接线,赋上权重值。激活值*权重值,求和。
把关注区域的权重赋值为正,其他所有的权重为0,对所有像素值取加权和,就会只累积我们关注区域的像素值了。
如果想识别出是否存在一条边,只需给周围一圈的像素赋予负的权重。
在神经网络中,需要激活值在0-1之间。
把加权和输进某个函数,压缩到0-1之间
sigmoid函数/logistic/逻辑斯蒂曲线,把非常大的负值变成接近0,非常大的正值,变成接近1
有时希望大于10再激活,可以-10(这个附加的数叫做偏置),再送进sigmoid函数
权重告诉你第二层的神经网络关注什么样的像素图案
这一层每个神经元,都会和第一层全部的784个神经元相连接,每个各带一个偏置
整个神经网络,很多个权重和偏置。及其如何学习,实际上是计算机如何设置这一大坨的数字参数
符号表达,表示所有连线
把某一层中所有的激活值统一成一列向量
把它和下一层所有的权重放到一个矩阵中,矩阵第n行就是这一层的所有神经元和下一层的神经元连线的权重
权重矩阵和向量乘积的第n项,是这一层所有的激活值和下一层第n个神经元间连线权重的加权和
神经元,数字的容器,函数(输入是上一层所有神经元的输出,输出是0-1之间的值)
其实整个神经网络就是一个函数,复杂一点的函数
神经网络是如何通过数据,来获得合适的权重和偏置的?下集
早期的神经网络用sigmoid函数映射到0-1之间,模拟生物神经元的激活。
但现在的神经网络基本不用sigmoid函数了,用ReLU线性整流函数,返回0和a的最大值,其中a是函数的输入
模拟生物的神经元,大于某一值就激发
在特别深的神经网络上效果特别好