深度解剖(1):我说,深度学习就是一个小游戏,你敢信吗?

以下是我个人关于深度学习的所有见解,其后会对深度学习思想,正反向传播,损失函数,正则惩罚,梯度下降,矩阵求导,网络搭建,等等都进行详细的讲解!只有你想不到的,没有我讲不到的。让我用最通俗的语言,为你留下最深刻的印象,后来的年轻人以及我徒弟,好好加油!
深度解剖(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

下小节,将会为大家讲解反向传播的概念。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值