李宏毅 机器学习(2)- dl简介、反向传播、keras入门

机器学习

Posted by renjie on May 27, 2020


李宏毅 机器学习(2)- dl简介、反向传播、keras入门

1、历史

2、理解neural network

step1: define function set

尽管neural network很复杂,但是可以把它看成是一个function,进去input 是一个vector,出来output也是一个vector。定义神经网络结构就是定义这个function set

矩阵运算

Hidden layer实际上就是做的feature extractor replacing 和 feature engineering的工作

经过softmax处理后,outputlayer就是multiclassifier

在训练之前,关键就是设计神经网络的结构: trial and error + intuition 直觉经验

step2: goodness of function and step3: find best function

loss function = cross entropy

还是用gradient descent 进行reduce loss

3、backpropagation

Backpropagation(反向传播),就是告诉我们用gradient descent来train一个neural network的时候该怎么做,它只是求微分的一种方法,而不是一种新的算法

Chain Rule(链式法则)

有人已经做了详细的笔记,推导部分见https://sakura-gh.github.io/ML-notes/ML-notes-html/9_Backpropagation.html

summary

Forward Pass + Backward Pass

4.Keras

keras 是tensorflow和theano的一个interface,简单易学

建立model的过程比较像搭积木

mini batch vs stochastic gradient descent

mini batch ,假设我们设size为100,那么就是随机抽100个数据放入一个batch,每个batch更新一次参数,epoch数就是对所有batch更新几轮。

batch size =1 , 则变为stochastic gradient descent

Batch size and Training Speed

相较于batch size=1,你会更倾向于选batch size=10,因为batch size=10的时候,是会比较稳定的,因为由更大的数据集计算的梯度能够更好的代表样本总体,从而更准确的朝向极值所在的方向

batch size会受到GPU平行加速的限制,太大可能导致在train的时候卡住,而且容易掉到local minimum里去

因此batch size既不能太大,因为它会受到硬件GPU平行加速的限制,导致update次数过于缓慢,并且由于缺少随机性而很容易在梯度下降的过程中卡在saddle point或是local minima的地方(极端情况是Full batch);而且batch size也不能太小,因为它会导致速度优势不明显的情况下,梯度下降曲线过于不稳定,算法可能永远也不会收敛(极端情况是Stochastic gradient descent)

code

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Activation, Dense

# step 1:define a set of function——neural network

model = Sequential()

model.add(Dense(input_dim=28 * 28, units=500, activation='sigmoid'))

model.add(Dense(units=500, activation='sigmoid'))

model.add(Dense(units=10, activation='softmax'))

# Step 2:goodness of function——cross entropy

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# Step 3:pick the best function


(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

model.fit(x_train,y_train,batch_size=100,epochs=20)
score = model.evaluate(x_test,y_test)
print('Total loss on Testing Set:',score[0])
print('Accuracy of Testing Set:',score[1])
Total loss on Testing Set: 0.11766348047330975
Accuracy of Testing Set: 0.9623000025749207