以下是我个人关于深度学习的所有见解,其后会对深度学习思想,正反向传播,损失函数,正则惩罚,梯度下降,矩阵求导,网络搭建,等等都进行详细的讲解!只有你想不到的,没有我讲不到的。让我用最通俗的语言,为你留下最深刻的印象,后来的年轻人以及我徒弟,好好加油!
深度解剖(0):最通俗易懂,详细无死角的深度学习讲解(目录)
如果有说得不对的地方,欢迎大家指出,我会第一时间进行修改,有兴趣可以加微信17575010159 一起讨论技术,如果觉得喜欢,一定要点赞,因为这是对我最大的鼓励。
像游戏的学习
在讲解深度学习之前,我先给大家讲个猜谜游戏吧,个人感觉机器学习,就是使用了这种思想。我相信在大家小时候自己玩过,或者看别人玩过这样的游戏吧:
假设现在有小五五和小嘟嘟两个人。首先小五五呢,在纸上写一个数字,然后让小嘟嘟去猜。每次小嘟嘟只能猜一个数字,然后小五五就告诉他,他猜的这个数字是大了,还是小了。然后小嘟嘟根据提示又重新猜,猜了之后,小五五又告诉小嘟嘟他猜的数字是大了还是小了…,就这样周而复始的循环。直到小嘟嘟猜对为止,然后记录下小嘟嘟猜的次数。
最后再反过来,小嘟嘟写下一个数字让小五五猜,直到小五五猜对,记录下小五五的次数,最后次数少的那个人呢,就算赢了。大的那个就要以身相许,所以啊,无论他们谁赢了,反正两个人是在一起了!
好了,游戏和玩笑就讲到这里。我们先来看看这个游戏的核心思想。其核心思想就是在于提示或者说纠正,当猜数字的人猜错的时候,就会收到提示纠正,他就知道自己该往那个地方去猜,如果之前猜大了,那么这次就猜小点,如果之前猜小了,那么这次就猜大点。只要猜测的次数足够多,肯定能够慢慢逼近那个数字,然后猜对。
这里就是一个不断学习,不断纠错的过程
什么是学习
那么问题来了,无论机器学习,还是深度学习他们的重点都是学习。因为学习是动词嘛,记得以前英语老师说动词最重要了。那么机器是怎么学的?
其实机器和人是一样的,在学习的过程中,他也是一步一步学习过来了。机器慢慢的学习,他也不知道自己学习的知识是不是正确的,这个时候就需要按照我们人为预先设定的方法,一步一步的去纠错,让他往对的方向,一个好的方向学习,免得小机器被教坏了。其机器学习知识的快慢程度,我们可以称为他为学习率。
古人说,知错能改,善莫大焉。当然要知错才能改错,那么问题来了,怎么才能让机器知道自己的错误,然后去纠正错误呢?在上面的例子中是通过猜测(预测)的值和真实的值做比较。照葫芦画瓢,现搬现套,其实机器学习也是这样的,拿着机器预测得值,去和实际的值做比较。在有了对的答案情况下,当然就能判断出错误的偏差,就好比如你做数学题,你不知道自己做得对不对,但是一看答案,你马上就知道自己错了没有。 到这里会涉及一个概念,机器学习中实际的值,我们称为标签(暂时可以这样理解,后续详细解说)。
不急,如果还不是明白,请继续往下看,下面是我编写的一个最最最简单的机器学习了:
# 假设现在人为的设定一个数字,然后让计算机进行猜测,看计算机如果猜到这个数字
import random
# 该数字,为我们设定的数字,让机器进行猜测
set_num = 50.0
#
lr = 2.0
#
num = random.randint(-100,100)
print(num)
for i in range(100):
# 如果猜测的值,比设定的小,则增大1.0 *lr数值,重新猜测
if num < set_num:
num += 1.0 *lr
# 如果猜测的值,比设定的大,则增大1.0 *lr数值,重新猜测
elif num > set_num :
num -= 1.0 *lr
# 如果猜测正确则打印正确得数字
else:
print('cp正确猜测到数字: %f' %num)
print('cp猜测数值: %d, 实际为 :%f'%(num,set_num))
我随机运行了一次,打印结果如下:
cp猜测数值: 83, 实际为 :50.000000
cp猜测数值: 81, 实际为 :50.000000
cp猜测数值: 79, 实际为 :50.000000
cp猜测数值: 77, 实际为 :50.000000
cp猜测数值: 75, 实际为 :50.000000
cp猜测数值: 73, 实际为 :50.000000
cp猜测数值: 71, 实际为 :50.000000
cp猜测数值: 69, 实际为 :50.000000
cp猜测数值: 67, 实际为 :50.000000
cp猜测数值: 65, 实际为 :50.000000
cp猜测数值: 63, 实际为 :50.000000
cp猜测数值: 61, 实际为 :50.000000
cp猜测数值: 59, 实际为 :50.000000
cp猜测数值: 57, 实际为 :50.000000
cp猜测数值: 55, 实际为 :50.000000
cp猜测数值: 53, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
代码是很容易理解的,就是让机器不停的去学习,去纠正猜测的错误,并且给他一个学习率。这个学习率可以任意设定。
大家应该也发现了一个问题,就是学习率设置得比较大得时候,可能会导致机器永远没有办法猜测到那个正确得数值。如果学习率设置得比较小,只要猜测的次数够多,他最终肯定能猜测到那个数值,但是代价就是要猜测很多次。
一般情况下,再实际中,我们最初的时候把学习率设置大一点,等猜测稳定之后,即就是类似于上面:
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
cp猜测数值: 49, 实际为 :50.000000
cp猜测数值: 51, 实际为 :50.000000
我们再把学习率调低一点,然后慢慢逼近要猜测的值,这样不仅需要猜测的次数减少了,并且还能准确猜测到正确的数字。
让机器更厉害
前面的游戏中,我们发现,可以让机器猜测数字了,但是这个又什么用呢?实际的生活中没有必要去让机器才一个数字。那么,我们就让他升级一下把,我们让机器去找一个数字,这个数字是真的有用的东西,下面是升级之后的代码:
import random
import numpy as np
random.seed(10)
# 学习率,可以理解为纠正错误,或者逼近正确值的速度
lr = 0.001
# 每一次训练样本的个数
batch_size = 10
# 生成房子的面积数据200个
area_sample_data = np.array([ random.randint(50, 200) for i in range(200)])
#print(area_sample)
# 对应房子每个平方的真实价格,最后需要让机器猜到这个值,或者接近这个值
true_unit_preice = np.array([ random.uniform(1, 2) for i in range(200)] )
# 每个房子的总价格
sum_preice_label = area_sample_data * true_unit_preice
# 初始化第一次机器猜测的房子价格,最后我们要求的就是这个,让这个值接近上面的true_unit_preice
logic_unit_preice = random.uniform(-5,5)
# 求得样本数据以及标签的长度
area_sample_data_len = area_sample_data.shape[0]
#print(area_sample_data_len)
sum_preice_label_len = sum_preice_label.shape[0]
#print(sum_preice_label_len)
# 表示把数据训练完,需要猜测多少次
batch_num_sum = area_sample_data_len // batch_size
# 获得10个训练样本和标签
def get_train_label(num):
cur_batch_num = num %batch_num_sum
#print(cur_batch_num)
return area_sample_data[cur_batch_num*batch_size: (cur_batch_num+1)*batch_size],\
sum_preice_label[cur_batch_num*batch_size: (cur_batch_num+1)*batch_size]
# 这里的3000代表的是猜测的次数,可以看作猜测3000
for i in range(3000):
# 每次去出10个样本进行进行训练迭代
batch_sample_data, batch_preice_label = get_train_label(i)
#print(batch_sample_data.shape, batch_preice_label.shape)
# 让机器进行预测,得到逻辑推理的房子总价
logic_sum_preice = batch_sample_data * logic_unit_preice
# 计算出10个样本平局的错误值
loss = np.mean(logic_sum_preice - batch_preice_label)
# 如果预测房价高了
if loss > 0:
logic_unit_preice -= lr
# 如果预测房价低了
if loss < 0:
logic_unit_preice += lr
if i%100 == 0:
print(loss)
# 最后打印机器猜到的数值
print('logic_unit_preice', logic_unit_preice)
运行程序之后,打印信息如下:
-381.5779621268998
-367.5579621269013
-353.5379621269028
-339.51796212690346
-325.4979621269034
-311.4779621269034
-297.45796212690334
-283.4379621269034
-269.4179621269034
-255.39796212690325
-241.37796212690333
-227.3579621269033
-213.3379621269033
-199.31796212690327
-185.2979621269033
-171.27796212690325
-157.25796212690324
-143.23796212690326
-129.21796212690322
-115.1979621269032
-101.1779621269032
-87.15796212690319
-73.13796212690319
-59.11796212690416
-45.0979621269057
-31.077962126907238
-17.618762126908717
-6.122362126909986
-0.7947621269105725
-0.5143621269106091
logic_unit_preice 1.481269154591729
可以看到loss一直在慢慢的减少,loss可以代表错误值,这说明机器猜测的数值越来越逼近准确值。
在上面的程序总,我们可以看到,每次训练样本的数据,都是10个,可以理解为,每次都猜测了十个数值,然后把这是个数值求了个平均值。
这面的程序中,主要是为了讲解机器学习的思想,让大家知道机器到底是怎么去学习,怎么去纠正的。其中有几个概念要理解:
# 学习率,可以理解为纠正错误,或者逼近正确值的速度
lr
# 每一次训练样本的个数,也就是批次数目
batch_size
# 机器猜测之后,距离样本的偏差值
loss
下小节,将会为大家讲解反向传播的概念。