【原创】机器学习从零开始系列连载(8)——机器学习中的统一框架

【公众号后台回复 Loss 获取本文涉及的两篇论文】

机器学习中的统一框架

很多机器学习问题都可以放在一个统一的框架下讨论,这样大家在理解各种模型时就是相互联系的。

目标函数

回忆一下目标函数的定义:
其实,很多模型可以用这种形式框起来:
比如linear regression、logistic regression、SVM、additive models、k-means,neural networks 等等。
其中损失函数部分用来控制模型的拟合能力,期望降低偏差;正则项部分用来提升模型泛化能力,期望降低方差,最优模型是对偏差和方差的最优折中。

损失函数

损失函数反应了模型对历史数据的学习程度,我们期望模型能尽可能学到历史经验,得到一个低偏差模型。
Q:大家想想横坐标是什么?
实践当中很少直接使用0-1损失做优化(当然也有这么用的,比如下面两篇论文,可以通过公众号后台获得
Direct 0-1 Loss Minimization and Margin Maximization with Boosting:【公众号后台回复 Loss 获取这篇论文】
Algorithms for Direct 0–1 Loss Optimization in Binary Classification:【公众号后台回复Loss获取这篇论文 】
但总的来说应用有限),原因如下:
  • 0-1损失的优化是组合优化问题且为NP-hard,无法在多项式时间内求得;

  • 损失函数非凸非光滑,很多优化方法无法使用;

  • 对权重的更新可能会导致损失函数大的变化,即变化不光滑;

  • 只能使用正则,其他正则形式都不起作用;

  • 即使使用正则,依然是非凸非光滑,优化求解困难。

由于0-1损失的问题,所以以上损失函数都是对它的近似。原理细节可以参考:Understanding Machine Learning: From Theory to Algorithms
不同损失函数在相同数据集下的直观表现如下:

正则化项

正则化项影响的是模型在未知样本上的表现,我们希望通过它能降低模型方差提高泛化性。
如果有数据集:
在给定假设下,通常采用极大似然估计(MLE)求解参数:
假设模型参数也服从某种概率分布 , 可以采用极大后验概率估计(MAP)求解参数。

L2 正则

假设

 L1 正则

假设

正则化的几何解释

L1 and L2 Regularization
不同q的取值下正则项的几何表现如下:

from wiki

 Dropout正则化与数据扩充

这两类方法在神经网络中比较常用,后面会专门介绍。

神经网络框架

很多模型可以看做是神经网络,例如:感知机、线性回归、支持向量机、逻辑回归等。

Linear Regression

线性回归可以看做是激活函数的单层神经网络:

Logistic Regression

逻辑回归可以看做是激活函数的单层神经网络:

Support Vector Machine

采用核方法后的支持向量机可以看做是含有一个隐层的3层神经网络:

Bootstrap Neural Network

采用bagging方式的组合神经网络:

Boosting Neural Network

采用boosting方式的组合神经网络:

前情回顾

神经网络在维基百科上的定义是:

NN is a network inspired by biological neural networks (the central nervous systems of animals, in particular the brain) which are used to estimate or approximate functions that can depend on a large number of inputs that are generally unknown.(from wikipedia)

神经元

神经元是神经网络和SVM这类模型的基础模型和来源,它是一个具有如下结构的线性模型:
其输出模式为:
示意图如下:

神经网络的常用结构

神经网络由一系列神经元组成,典型的神经网络结构如下:
其中最左边是输入层,包含若干输入神经元,最右边是输出层,包含若干输出神经元,介于输入层和输出层的所有层都叫隐藏层,由于神经元的作用,任何权重的微小变化都会导致输出的微小变化,即这种变化是平滑的。
神经元的各种组合方式得到性质不一的神经网络结构 :

前馈神经网络

反向传播神经网络

循环神经网络

卷积神经网络

自编码器

Google DeepMind 记忆神经网络(用于AlphaGo)

一个简单的神经网络例子

假设随机变量 , 使用3层神经网络拟合该分布:

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import random
import math
import keras
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
def gd(x,m,s):
left=1/(math.sqrt(2*math.pi)*s)
right=math.exp(-math.pow(x-m,2)/(2*math.pow(s,2)))
return left*right
def pt(x, y1, y2):
if len(x) != len(y1) or len(x) != len(y2):
print 'input error.'
return
plt.figure(num=1, figsize=(20, 6))
plt.title('NN fitting Gaussian distribution', size=14)
plt.xlabel('x', size=14)
plt.ylabel('y', size=14)
plt.plot(x, y1, color='b', linestyle='--', label='Gaussian distribution')
plt.plot(x, y2, color='r', linestyle='-', label='NN fitting')
plt.legend(loc='upper left')
plt.savefig('ann.png', format='png')
def ann(train_d, train_l, prd_d):
if len(train_d) == 0 or len(train_d) != len(train_l):
print 'training data error.'
return
model = Sequential()
model.add(Dense(30, input_dim=1))
model.add(Activation('relu'))
model.add(Dense(30))
model.add(Activation('relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mse',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(train_d,train_l,batch_size=250, nb_epoch=50, validation_split=0.2)
p = model.predict(prd_d,batch_size=250)
return p
if __name__ == '__main__':
x = np.linspace(-5, 5, 10000)
idx = random.sample(x, 900)
train_d = []
train_l = []
for i in idx:
train_d.append(x[i])
train_l.append(gd(x[i],0,1))
y1 = []
y2 = []
for i in x:
y1.append(gd(i,0,1))
y2 = ann(np.array(train_d).reshape(len(train_d), 1), np.array(train_l), np.array(x).reshape(len(x), 1))
pt(x, y1, y2.tolist())



1.机器学习原来这么有趣!【第一章】

2.机器学习原来这么有趣!【第二章】:用机器学习制作超级马里奥的关卡

3.机器学习从零开始系列连载(1)——基本概念

4.机器学习从零开始系列连载(2)——线性回归

5.机器学习从零开始系列连载(3)——支持向量机

6.机器学习从零开始系列连载(4)——逻辑回归

7.机器学习从零开始系列连载(5)——Bagging and Boosting框架

(0)

相关推荐