Bootstrap

关于深度学习中优化问题的一些感受

    本人刚开始接触深度学习,可以写一些简单的CNN网络,目前使用到的语言是python基础,搭配Pytorch框架,在一段时间内感到对深度学习的困惑,不知道进一步学习的方向。

在学习深度学习之前,无数的人告诉我,数学是学习深度学习的基础,不会就很麻烦,需要补。对于我个人来说,数学要是能学会,我又何必学习深度学习?于是各种尝试如何在数学基础一般的情况下,熟悉深度学习。

Don't BB ,show me the code!

就不!你咬我啊?

从CNN开始,不理解数学,硬写!写了一遍又一遍,把网络模型每一行都熟悉,抠除掉无关代码和核心框架,发现了网络模型的套路:

1、读取数据集,并进行数据预处理;

2、构建合适的网络模型,训练数据;

3、调用优化器(感知器),进行参数优化;

4、反向传播,更新参数,进行新一轮数据测试;

5、评估网络模型的准确率。

就在此时,看到了大神写的CNN,居然发现了其中可以优化的地方(PS:别问我为什么要优化,还不是因为设计的模型准确率不高、适应性不强):

首先可以优化的地方是参数:学习率、批数(btch_size),结果效果不怎么明显;

其次优化的是网络模型,涉及到的主要是网络模型的层数和激活函数,卷积层中可以设置的又主要是卷积核数、步长值、填充,激活函数主要是函数的选择上;

到此,一般的深度学习的科普工作就完成了,已经可以自己动手设计自己的网络模型了,有没有很兴奋?

那么,如果你目前没有深度学习的项目时,你就会迷茫,不知道下一步的工作在哪里。

经过一段时间的沉默,也是因为大神的指导,要想进一步优化,需要更改网络模型中常见函数的设置,即函数的优化。

在这,你有没有想明白为什么一开始说学习深度学习,要学习数学呢?

在这里,深度学习涉及到的数学知识就开始体现了,线代、概率、矩阵论、离散、运筹等等,各种预苦无泪啊,数学不好。

也许是运气太好了,我又遇见深度学习上的另一位大神,神说,对于计算机来说,数学是工具、是基础,那么对于数学来说,计算机也是工具、是基础。理解代码,就能理解数学。

在这样的指导下,再次回头去看自己写的代码,从中找到目前可以做的工作,对比激活函数的区别,进行网络模型优化:

SGD(随机梯度下降):

Momentum(在SGD的基础上,加载梯度下降的动量):

RMSprop:

Adam:

然而,真正地,准确率更高的这些个网络模型的核心就是这里的区别,自己设计的激活函数和感知器。剩下的先不说了,给放个代码感受下最简单的感知器的设计:

# -*-coding:utf-8-*-

# 自定义SGN感知器
import numpy as np

a = 0.3
x = np.array([[1, 1, 3], [1, 2, 5], [1, 1, 8], [1, 2, 15], [1, 3, 7], [1, 4, 29]])
d = np.array([1, 1, -1, -1, 1, -1])
w = np.array([1, 0, 0])


def sgn(v):
    if v >= 0:
        return 1
    else:
        return -1


def comy(myw, myx):
    return sgn(np.dot(myw.T, myx))


def neww(oldw, myd, myx, a):
    pred = comy(oldw, myx)
    print(oldw + a * (myd - pred) * myx)
    return oldw + a * (myd - pred) * myx


for i in range(len(x)):
    w = neww(w, d[i], x[i], a)
    print("%d or %d" % (x[i][1], x[i][2]), comy(w, x[i]))
test1 = np.array([1, 9, 19])
print(comy(w, test1))
test = [1, 9, 64]
print(comy(w, test))
test=[1,5,11]
print(comy(w,test))

这其实就是一个机器学习的小例子,但是如你所愿,在没有学习太多数学的前提下,你已经完成了一小部分深度学习及其优化的问题。

分析上面的小例子,可以看出在每一步骤都可以找到一组优化后的参数组W,也了解了深度学习以矩阵为载体所进行的优化,那么我们接下来把自己做的以手写体和caifa10等数据集为数据源的卷积神经网络,我们尝试在过程中使用numpy包把多维数据变成一维数据进行计算,可以看到参数究竟是怎么优化的,所以当你自己再去设计网络模型的时候,就可以从底层设计感知器和激活函数了。

好吧,编不下去了,因为我的理解也就先到这了,如果对你有用,记得点个赞。

转载于:https://my.oschina.net/aisi746467512/blog/1837576

;