2016年是人工智能发展得最为迅速的一年,涌现了许多机器深度学习技术框架,当中不乏前端JavaScript写的机器深度学习框架 - convnetjs,本文为大家探秘机器学习的基本原理与讲解入门例子。
机器学习原理概述
(1)首先我们来了解一下仿生学
仿生学就是人们研究生物某些器官的构造和功能,从中得到启发并进行模仿,研制成功新的仪器,机械。比如人类模仿蝙蝠回声定位原理制作汽车上的倒车雷达,那么机器学习也是模仿人类大脑学习原理
(2)我们来科普一下人类大脑的运作原理
大脑由过百亿神经细胞组成,各神经细胞连接在一起构成庞大的神经网络,神经细胞通过神经递质与周围的神经细胞传递信息,包括激活与被激活
视觉、听觉等所接收的外界信息最终都以神经递质的形式传递入大脑的神经细胞,激活一定规模的神经细胞,形成被激活的一小规模的神经网络
国外有研究人员做过测试:拿一些当红的明星照片给测试者看(同一个明星多张不同角度拍摄的照片),研究人员发现当测试者看到同一个人出现在另一个照片时会激活相同的神经细胞
被激活的神经细胞也会衰退,每个细胞都有生命周期神经细胞也不例外,另外如果有新的刺激到来原来的刺激就会衰退得更快,例如遗忘一些事情
被激活的神经细胞所构成的小规模神经网络,该网络可以产生形态变化,并且可以激活其他小规模神经网络,进一步相互激活发生变化形成相对规模更大的神经网络,这就是我们脑部进行高级活动的运作原理,比如:联想、幻想、分析、对比、推理、总结等等
大脑里面各功能区的分工明确,左脑被称为“语言脑”,它的工作性质是理性的、逻辑的;而右脑被称为“图像脑”,它的工作性质是感性的、直观的
大脑存在正负激励,比如:受伤会传递痛觉的负激励,运动时脑垂体会分泌多巴胺产生愉悦感觉的正激励
还有很多各种各样的激励,比如一些生活细节,人际相处等等所产生的激励,长期处于复杂的环境中会产生更复杂的大脑思考,形成情感、性格、人格等等。感兴趣的小伙伴可以深入研究。就以上几点大脑运作原理与特征,我们用计算机模拟出来足以做很多事情
(3)接下来我们用计算机模拟大脑的运作
我们来用编程语言的数据结构、数组、对象、函数等大家编程中经常用到的东西来模拟
模拟神经细胞:
细胞体我们建立一个对象,神经递质则为对象的属性这里用权重w表示,接收输入的时候把权重累加起来,输出的时候通过应激函数f调整权重再输出到下一个神经元对象
模拟神经网络:
分层神经网络
包含输入层、隐层、输出层,输入的信息通过输入层进入,传递到隐层调整权重,最终在输出层输出结果,当遇到训练信号产生误差修正权重返回隐层(训练信号相当于对神经网络的激励)
3维网状神经网络
由分层神经网络扩展出来,更贴近真实的模拟,其输入、输出、权重的修正都是网状结构进行,可以处理更复杂的事情
convnetjs入门例子
var net;
var layer_defs = [];
var trainer;
var list = [0, 1, 2, 3];
var listVol;
function start() {
// 初始化网络
net = new convnetjs.Net();// 初始化网络层 // 输入层 type:input是输入层 三个维度是 (x y depth) layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:2}); // 链接层 type:fc是链接层 num_neurons:神经元数目 activation:网络层间传递信息激活函数 relu:默认的常规激活函数 layer_defs.push({type:'fc', num_neurons:20, activation:'relu'}); layer_defs.push({type:'fc', num_neurons:20, activation:'relu'}); // 输出层 type:softmax是输出层 softmax:限制了输出的概率总和为1 num_classes:概率分类数量 layer_defs.push({type:'softmax', num_classes: list.length}); // 把各层添加到网络中 net.makeLayers(layer_defs); // 新建数值列表对象 listVol = new convnetjs.Vol(list); // 建立训练对象 // learning_rate:网络训练速率(速率越高训练越快但网络容易混乱) // l2_decay:衰退率(衰退率越高网络不容易出现混乱崩毁但学习效果成果会有所下降) trainer = new convnetjs.Trainer(net, {learning_rate:0.01, l2_decay:0.001}); // 输出数值在网络中的权重比例 output(); } // 输入数值下标,调整数值在网络中的权重比例,训练网络 function trainNet(position) { trainer.train(listVol, position); output(); } // 输出数值在网络中的权重比例 function output() { var probability = net.forward(listVol); for(var i = 0; i < list.length; i++) { var tmp = probability.w[i] * 100; document.getElementById('percent' + i).innerHTML = tmp + '%'; } }
例子为分层神经网络,输入层为1x1x2,建立了两个隐层,神经元数量分别为20个,输出层为概率分类输出,点击按钮对0、1、2、3四个数字在网络中进行权重调整,最终输出这四个数字在网络中的权重概率,当多次点击训练数字2其权重比例明显增大
例子完整代码:
https://github.com/zhangxiongwu/convnetjs-demo
例子在线演示:
http://htmlpreview.github.io/?https://github.com/zhangxiongwu/convnetjs-demo/blob/master/demo.html
关于convnetjs的相关学习资料
官方地址:
http://cs.stanford.edu/people/karpathy/convnetjs/
官方api文档:http://cs.stanford.edu/people/karpathy/convnetjs/docs.html
官方框架源码与例子:
https://github.com/karpathy/convnetjs
官方深度学习例子:(在浏览器上训练出一个会玩吃苹果游戏的网络)
http://cs.stanford.edu/people/karpathy/convnetjs/demo/rldemo.html
结语:convnetjs机器学习框架可以在浏览器上训练深度网络,也可以结合nodejs在服务器上运行构建网络,可以用它做一些新颖的小游戏或小工具,比如:用户和训练出来的网络(该网络可以是预先在服务器上训练好的json数据,直接传到客户端,或者直接和服务器上训练好的网络交互游戏操作数据)进行人机大战,看谁在小游戏中胜出。或者在服务器上做一些数据分类或预测的小工具,识别图像数据、音频数据等等
您的意见是我改善的东西,欢迎评论提建议,如果对您有帮助,请点个赞,谢谢~~
菲麦前端专题,汇聚前端好文,邀您关注!