之前学习的技术主要解决了两类问题:
1.海量数据的存储
2.海量数据的计算
都是基于历史数据进行总结统计,基于统计出来的指标对于公司的决策做出一定的变化,这个过程叫做BI 商业智能
有总结就得有展望,对未来做预测
基于之前学的技术是无法做展望的,之前学习的技术只能对过去做总结
机器学习:展望未来
如何基于历史数据去展望预测未来!
机器学习的场景:
语音交互软件:Siri,Cortana,Now (预测)
Google利用大数据+机器学习预测H1N1在美国某小镇爆发的可能(预测)
2016年8月,IBM 智能医疗人工智能“沃森”仅花10分钟,诊断出一名60多岁女性患有一种罕见的白血病,并提供了个性化诊疗方案
人工智能阅读了非常多的罕见病的文献,
QQ 购物网站的推荐系统 电商领域:亚马逊推荐率32% 全年流水32%来源于推荐系统的功能,京东高峰的时候可以达到17% 不是因为技术差,而是因为数据的质量。用户资料只填写了一小部分,京东怎么去了解你,绘制用户画像,推荐商品也不会特别符合,提升数据质量后面会单独展开,利用一些算法提升数据质量。
5G时代无人驾驶会迎来一波高潮。
5G基站设计可以连接非常多的终端的,万物互联。采用的是微基站,非常的小,可以随时安装,可以做到全方面的覆盖信号,还会引来一种计算:边缘计算
边缘计算非常像一种生物:八爪鱼
八爪鱼的神经大部分都是集中在脚的部分,头部大概占了40%的神经,八爪鱼在前进的时候会接触到一些障碍,会收集到信号。把收集来的信号,首先会在爪子部位进行计算,不会立马交给头部,爪子上的神经加起来有60%,计算完之后再做下一步的行为,只有传递来的信息非常复杂的时候,才会把信息传递给头部,头部计算完之后再指挥爪子怎么去做,这就叫边缘计算。
万物互联的时代会连非常多的终端,一台行驶中的无人汽车采集来的信息完全可以交给旁边停靠的无人汽车来计算,而不需要传给中央服务器计算,延迟是非常高的,可能差了0.2秒就是一条人命。
当5G时代来了就可以这样玩,把信息采集给附近的服务器来做计算,采集给附近的服务器计算也得耗电,可以基于区块链来做付费。
机器学习=>通过历史数据,展望未来。
原理:
为什么机器学习可以展望未来?
让机器去学习,机器就会变得智能, 人工智能,人类伟大的目标,愿望。
怎么才能让机器像人一样智能,让机器去学习。
机器学习是实现人工智能的手段。
人类 非常傻=>智能 是怎么做的?
举例:不会做饭=>做饭 曾经做了100次饭都失败了,失败的时候会得到失败的经验,水放多了,盐放多了,人是有思维的,可以基于着100次失败的经验归纳总结,得到一套规律,这个规律会越来越准。
人变得智能的原理:经验+思维=规律
脑子里的规律越准,做出来的饭就会越好吃。这就是人智能的原理。
不听老人言,吃亏在眼前。老人的年龄大,曾经的经验很足,规律一定是比我们准的。机器学习的原理和人成长的原理一模一样。
人成长的经验用数据来表示,完全没问题,人的思维用算法来代替,算法的全程就是计算方法,排序:最终的结果让一堆乱序的数变成有序的数,不同的排序算法只是思想不一样,算法代表的是思想。
数据+算法=>模型(实质就是规律)
服务器也可以训练出来规律。训练模型=找规律
孔子 传道授业解惑也
孔子 72贤弟子 3000弟子 游历民间,体察民情(收集数据) 采用的也是分布式计算,孔子掌握的信息来自于3000多人采集的,孔子的经验很足,假设他的思维一般般,总结出来的规律也一定是很准的。
无监督学习是没有规律的
想让规律足够的准有3个手段:
1.提高数据量和算法
2.提高数据量
3.使用牛逼算法
但是在人工智能领域里有一句话,数据量决定了模型的高度,算法只是逼近这个高度。大数据是机器学习的根基。
人工智能岗位
有一批薅羊毛的公司完全是为了人工智能而做人工智能,一点数据量都没有,为了业务而做人工智能的,一定是有海量数据的,这样才有意义。
商业智能 称之为 BI
机器学习 称之为 AI
机器学习:
人工智能:目标 交叉学科(比如股票预测,需要金融学和算法)
大数据
深度学习:(神经网络) 线性回归 逻辑回归
人的神经细胞有神经元,轴突(连接神经元的桥梁),树突(采集信号)
神经网络就是把算法作为神经元,采集来的数据作为由这个算法处理完之后传递给下一个算法,每一个神经元都代表一个算法,神经网络可以做非常复杂的计算和业务处理,如果使用神经网络的话,思维会更准,对于经验规律的总结也会更准。
把我们讲的算法,使用神经元的格式串联起来了。
---------------------以上是科普,下面讲简单的线性回归算法,先入门------------------
y=w0+w1x
x=1 y=2
x=2 y=3
求解:w0 w1
w0叫截距 w1叫斜率
第一个问题:在求 w0 和 w1 的时候为什么需要两组数据?
两点确定一条直线,这个公式在二维空间中表示就是一条直线
假设横坐标是 x 纵坐标是 y 这两组数据在空间中就是两个点,两点确定一条直线
这根直线与y轴的交界就是截距,由w0决定的,这根直线的斜率就是w1决定的
可能会遇到一道错误题,它会给你三组数据,
x=1 y=2
x=2 y=3
x=3 y=5
把 w0 和 w1 求出来?能不能求出来?
通过找点连线的方式,发现这三个点,根本不在一条直线上。不能求出来。
无法准确的确定 w0 和 w1
老师会随便划掉一组数据,然后再去做,相当于空间中去掉一个点,两点确定一条直线,肯定能准确的求出。
但是遇到的这道错题,是机器学习问题,如果把这个错误放大,给你3亿组数据,这些数据都不在一条直线上,在空间中密密麻麻的分布,现在想找到比较完美的 w0 和 w1 肯定不能求出来准确的,什么样的线才是最好的线?
我们希望空间中的点,到直线的距离最近,此时的直线就能称为 ,是一根完美直线。
找到完美直线了, w0 和 w1 就能确定了,这根直线,代表了空间中数据的规律。
从3亿组数据中,找到一个这样的规律。
所以当初遇到的这道题是一道机器学习问题。是不是尽量多的落在这条直线上,不是的。
换句话说,所谓的规律,就是 w 参数
现在是通过画图的方式,找到一根直线,拟合空间中的点,距离这根直线很近。
机器怎么去找?
肯定不能画一个图,让机器去做图象识别,我们要把误差进行量化,把空间中的点,到直线的距离进行量化。
量化公式:(非常简单)
hθ 理解成空间中的这一根线 h=w0+w1x
比如有一个点 ( x , y ) 我把 x 带入到公式中,会计算出一个 y 值,它自身有一个真正的 y 值,这两个 y 值 相减,这就是点到直线的误差
因为有些点会落到直线的下方,它们相减有可能是负数,所以在后面加了一个平方,空间中的点是有3亿组,所以要把每一个误差加起来,所以有一个累加符号
前面又加上一个 1/m 就可以计算出空间中的点,到这根直线的平均误差,前面有个 1/2 方便后期求导计算
曾经说找到一根比较完美的直线,就是让我们函数的值最小。
为什么要平方取绝对值不行,后面会说。
再梳理一遍:
如果给你3亿组不在一根直线上的数据
求出来完美的 w0 和 w1
换言之,找出一根比较完美的直线
点到直线的距离是最近的我们说这根直线是完美的
如果这根直线穿过更多的点,不代表它是完美的,可能它与其余的点的距离就会很远
这根完美的直线的定义是:所有的点到这根直线的距离是最近的,称为完美的直线。
量化:
可以使用一个公式,求解空间中的点到直线的误差。
把空间中的每一个点的 x 值,带入到直线中来,它会求出来一个假设的 y 值
假设的 y 值,和真实的 y 值相减 这就是误差。
如果相减是负数肯定不行,负数和正数就把误差抵消了
所以加上一个平方
空间中有非常多的点,刚才说的只是一个点到直线的误差。
要把所有的点的误差全部加起来,所以有一个累加符号。
累加完还要求空间中的点到直线的平均误差,所以有一个 1/m
分母有个2方便后期求导,没有什么特殊含义。
问题转化了:
希望这个公式越小越好,J(θ) 这个值越小,空间中的直线就越完美。
求 J(θ) 的极小值
通过形状来看:
如果公式是个凸函数,只有极大值,只有凹函数才有极小值。
告诉大家:
这个函数是个凹函数 => 它是有极小值的
怎么求极小值?
求导
假设现在要求 y=(x-2)2 的极小值
所说的导数,就是在某一个位置,x值对y的影响度
这个公式的导数长什么样子:y=2x-4
在低谷的左半部分,导数都是负数,x 对 y 的影响是呈负增长的,x越大y越小。
右半部分,导数都是正数,x越大y越大
在横坐标为2这个位置,导数为0,对y是没有影响的
求它的极小值,就是让它的导数为0
而现在 w 是受 w0 和 w1 影响的
实际情况是一个凹曲面:
所以现在要求这个函数的极小值,
要求 w0 维度的导数为 0
再求 w1 维度的导数为 0
=> 要对 w0 和 w1 分别求导
它们的导数分别为 0
对 w0 w1 求 偏导
让两者分别等于0,然后把w参数求出来
但是:实质是求不出来的
在海量数据下,如果x特别多,通过偏导数为0来求解w参数,基本不可能。
需要很多的算力
结论:我们通过让它的导数等于0,来反推w,是不成立的
应该怎么办?
如果遇到了bug,首先会通过bug的信息,定位到代码部分
看不出来任何问题会随机的去修改代码,不断的去试
只能正向来试
假设:
w0 = 1
w1 = 1
把 w0 w1 3亿组数据 ( x , y ) 带入到公式中
这个公式有好几种名字:
最小二重法,误差函数,损失函数,目标函数(我们的目标是想让J(θ) 越小越好,所以起名也叫目标函数)
把随机出来的w值和3亿组数据,分别带到公式,误差函数中,最终可以给出一个误差值mse。
我能不能让误差=0 ? 一定不行。
我这3亿组数据都不是分布在一根直线上的,既然不是分布在一根直线上的,就一定求不出来一个准确的 w0 和 w1 只能求出来一个比较完美的,换而言之,找不到一个准确的直线,只能找到一根比较完美的直线。
既然不能让误差=0,是不是可以人为设置一个能够容忍的误差值。假设是0.01
当误差小于0.01 这个 w0 和 w1 就是最佳参数。
如果现在计算出来的误差值,大于能够容忍的0.01 再去调整w参数
把这3亿组数据,再带入到公式里来,又求出来一个误差。不断的去迭代
直到满足容忍误差值,我可以认为这个w参数是最佳参数,我也可以认为,这根直线就是最佳直线。
可能担心设置的这个误差非常的低,它会不断的去迭代。停止不了,所以让它停止迭代的条件,一般会设置为2个:
1.人为的设置迭代次数:假设10000次
2.通过误差阈值(容忍的误差)
达到其一就停止迭代。
流程:
1.随机 w0 和 w1 参数值
2.训练集数据(这3亿组数据)和随机出来的w参数带入到误差函数中,求解出它的误差
3.如果误差小于用户设置的误差阈值,那么此时的w参数就是最佳w参数
4.否则继续调整w参数,然后循环2、3步骤
为什么训练一个模型需要跑很长时间:
w不断的迭代
到此为止,模型训练完毕。。
这个公式就是我们的规律。
未来来了一个x值,比如x=100,要用这个模型做预测,把x=100这个值带入到公式中,可以求解出一个y值,这个y值就是我们预测的y值
训练模型参数调整的策略:
不断的调整参数,人工智能 调参工程师
迭代到9999次了,离误差非常近了,比如设置为0.01 非常接近容忍度了,它停止了,不会再迭代了,这样就比较可惜了。找到这个规律之后,下一次可以不设置这个迭代次数,或者把迭代次数设置大一点。或者这个误差比我们容忍的误差差一点也无所谓,
误差也不是越小越好,如果误差非常小,找到一个n阶n项式,这个模型有可能会过拟合,找到的规律不准。
----------------------------------- 拓 展 -----------------------------------------------
再来想这个误差函数:
为什么求的误差 是这个点到直线在 y 方向的误差?而不是到直线的垂直距离?
实际情况想把 x 带入到规律之后,预测的 y 值要更加的精准,所以更看重的是 y 方向的误差。
找到这根直线之后,希望未来来了一个 x 值,把这个 x 值带入到这个规律里之后,希望它预测的 y 值要更加的精准,比如现在有一条这样的数据
x=100 y=1000
这是一条测试数据,我已经知道y值是多少了,我把x带入到模型中,会预测出来一个y值,y=1000 而实际的y值是1000,误差100,这个100就可以说明规律的准确性,我们更希望,在y这个方向上差值越小越好。
所以这个误差函数,更专注的是y方向的误差,而不是点到直线的距离。
如果一味的去追求点到直线的距离更小,反而会适得其反。
怎么求点到直线的垂直距离:
现在追求的不是垂直距离,而是y方向的距离,
如果损失函数不是这样写,小括号里求得是垂直距离,就可以找到一根这样的直线,垂直距离更近,但y轴的误差更大。违背了y值更切近事实的目标。
刚才在调参数的时候,不断的去调整w的参数,把3亿组数据带入到函数中,看一下误差是否小于容忍的,关于w参数该怎么去调,该往大调整,还是往小调整,调整方向该怎么去确定。
比如w0越往大调整误差越大,这就违背了我们的思想,调整的幅度又该怎么去确定,该怎么调整才能更切合实际,让误差更小。这是下节课的内容。
梯度下降法来指导w的调参。