人工智能、機(jī)器學(xué)習(xí)與深度學(xué)習(xí)
1 人工智能 Artificial Intelligence
*達(dá)特茅斯學(xué)院 - 1956 -
一門交叉學(xué)科凿可,涉及數(shù)學(xué)黔宛、計(jì)算機(jī)科學(xué)凉馆、控制論、信息論、心理學(xué)、哲學(xué)等學(xué)科的邊緣學(xué)科
2 機(jī)器學(xué)習(xí)
*卡耐基梅隆大學(xué)-1997 -
如果一個(gè)程序可以在任務(wù)T上,隨著經(jīng)驗(yàn)E的增加葛碧,效果P也可以隨之增加,則這個(gè)程序可以從經(jīng)驗(yàn)中學(xué)習(xí)
機(jī)器學(xué)習(xí)的傳統(tǒng)算法包括決策樹學(xué)習(xí)过吻、推到邏輯規(guī)劃吹埠、聚類、分類疮装、回歸缘琅、貝葉斯網(wǎng)絡(luò)、神經(jīng)網(wǎng)絡(luò)
3 深度學(xué)習(xí)
深度學(xué)習(xí)系統(tǒng)是輸入層廓推,隱層刷袍,輸出層的多層網(wǎng)絡(luò)
深度學(xué)習(xí)不是萬能的,像很多方法一樣樊展,他需要結(jié)合特定領(lǐng)域的先驗(yàn)知識(shí)
深度學(xué)習(xí)是大腦呻纹,機(jī)器學(xué)習(xí)是腦殼,人工智能就是四肢
深度學(xué)習(xí)的發(fā)展歷程
1 神經(jīng)網(wǎng)絡(luò)的第一次高潮
1957-Frank-感知機(jī)
2 神經(jīng)網(wǎng)絡(luò)的第一次寒冬
1969-Marvin 能力有限只能分析線性問題专缠,對(duì)于異或問題束手無策-多層感知機(jī)
3 神經(jīng)網(wǎng)路的第二次高潮
1986-BP算法(反向傳播算法)-自然雜志
4 神經(jīng)網(wǎng)絡(luò)的第二次寒冬
1989-卷積神經(jīng)網(wǎng)絡(luò)(CNN) -梯度爆炸問題
1998-SVM算法(支持向量機(jī))貝爾實(shí)驗(yàn)室
5 深度學(xué)習(xí)的來臨
??《A Fast Learning Algorithm for Deep Belif Nets》
深度學(xué)習(xí)崛起的時(shí)代背景
算法有了雷酪,計(jì)算性能提升了,數(shù)據(jù)也有了
深度學(xué)習(xí)的應(yīng)用場(chǎng)景
圖像與視覺
- ImageNet 比賽 2013年
- 人臉識(shí)別
- 以圖搜圖
語音識(shí)別
2009年 高斯混合模型(GMM)被擊敗涝婉,語音識(shí)別領(lǐng)域首次成功
2016年百度語音識(shí)別準(zhǔn)確率高達(dá)97%
自然語言處理
- 情感分析
- 文本生成
- 語言翻譯
- 聊天機(jī)器人
個(gè)性化推薦
CTR(Click-Through-Rate) 點(diǎn)擊通過率
常見的深度學(xué)習(xí)網(wǎng)絡(luò)結(jié)構(gòu)
全連接網(wǎng)絡(luò)結(jié)構(gòu) FC FullConnected
卷積神經(jīng)網(wǎng)絡(luò) CNN Convolutional nutrual Netwwork
循環(huán)神經(jīng)網(wǎng)絡(luò) Recurrent Netural Network
機(jī)器學(xué)習(xí)回顧
輸入數(shù)據(jù)-> 機(jī)器學(xué)習(xí)方法 -> 估計(jì)函數(shù)
新數(shù)據(jù) ->估計(jì)函數(shù) ->預(yù)測(cè)結(jié)果
線性回歸的基本概念
- 什么是線性回歸
存在一個(gè)點(diǎn)集哥力,用一條曲線去擬合它的過程。如果擬合曲線是直線,就是線性回歸吩跋,如果是曲線就是二次回歸
- 基本概念:
假設(shè)函數(shù)(Hypothesis Function),用數(shù)學(xué)方法描述自變量和因變量之間的為一種函數(shù)關(guān)系
損失函數(shù)(Loss Function )寞射,用數(shù)學(xué)方法描述假設(shè)函數(shù)的預(yù)測(cè)值和真實(shí)值之間的誤差。均方差??(Mean Squared Error)一種損失函數(shù)锌钮,交叉熵??也是
優(yōu)化算法(Optimization Algorithm)
- 數(shù)據(jù)處理
1 選取有用的維度
2 是否處理離散值
3 歸一化(Mormalization)把各維的屬性的取值范圍放縮的差不多的區(qū)間:減掉均值桥温,然后除以原值取范圍
進(jìn)行歸一化的原因:1 ) 過大或者過小的數(shù)值范圍會(huì)導(dǎo)致計(jì)算時(shí)的浮點(diǎn)上溢或者下溢出;2 )不同的數(shù)值范圍會(huì)導(dǎo)致不同屬性對(duì)模型的重要性不同(至少在初始階段如此)梁丘,而這個(gè)假設(shè)常常不合理的侵浸。這回對(duì)優(yōu)化過程造成困難,使得使用時(shí)間大大加長(zhǎng)氛谜;3 )很多機(jī)器學(xué)習(xí)技巧/模型(L1通惫,L2正則項(xiàng),向量空間模型-Vector Space)都基于這樣的假設(shè):所有的屬性取汁差不多都是以0為均值切取值范圍是相近的
4 分割數(shù)據(jù)考慮的因素:更多的訓(xùn)練數(shù)據(jù)會(huì)降低參數(shù)估計(jì)的方差混蔼,從而得倒更可信的模型,而更多的測(cè)試數(shù)據(jù)會(huì)降低測(cè)試誤差的方差珊燎,從而得到更可信的測(cè)試誤差
5 驗(yàn)證集:僅針對(duì)復(fù)雜模型惭嚣,因?yàn)橛泻芏喑瑓?shù)(Hyperparameter)要調(diào)整
- 模型概覽(房?jī)r(jià)預(yù)測(cè))
- 效果展示(房?jī)r(jià)預(yù)測(cè))
深度學(xué)習(xí)框架介紹
深度學(xué)習(xí)框架的作用
- 簡(jiǎn)化計(jì)算圖的搭建
計(jì)算圖(computional gragh)-本質(zhì)上是一個(gè)有向無環(huán)圖,結(jié)點(diǎn)代表函數(shù)悔政,邊代表函數(shù)操作 - 簡(jiǎn)化偏導(dǎo)計(jì)算
- 高效運(yùn)行
常見的深度學(xué)習(xí)框架
CNTK | PaddlePaddle | Caffe2 | TensorFlow | PyTorch | MXNet
PaddlePaddle 簡(jiǎn)介
PaddlePaddle是百度開源的晚吞,易學(xué)易用的分布式深度學(xué)習(xí)平臺(tái)
PaddlePaddle 使用
- docker 安裝
mkdir ~/workspace
cd ~/workspace
touch housing.py
編輯 housing.py
import paddle.v2 as paddle
# 初始化
paddle.init(use_gpu=False,trainer_count=1)
# Configure the natural network
x = paddle.layer.data(name='x',type=paddle.data_type.dense_vector(13))
y_predict = paddle.layer.fc(input=x,size=1,act=paddle.activation.Linear())
with open('/workspace/fit_a_line.tar',r) as f:
parpameters = paddle.parameters.Parameters.from_tar(f)
# Infer using provided test data
probs = paddle.infer(
output_layer = y_predict,parameters = parameters,
input=[item for item in paddle.dateset.uci_housing.test()()])
for i in xrange(len(probs)):
print 'Predicted price: ${:,.2f}'.format(probs[I][0] * 1000)
運(yùn)行housing.py
docker run --rm -v ~/workspace:/workspace paddle paddle/paddle:latest python /workspace/housing.py
房?jī)r(jià)模型連接
[百度備用]
- pip 安裝
pip install paddlepaddle
import paddle.v2 as paddle
# initialize PaddlePaddle
paddle.init(use_gpu=False,trainer_count=1)
# Configure the neural network
x = paddl.layer.data(name='x',type=paddle_type.dense_vector(13))
y_predict = paddle.layer.fc(input=x ,size = 1,act = paddle.activation.Linear())
with open('fit_a_line.tar','r') as f:
parameters = paddle.parameters.Parameters.from_tar(f)
# infer using provided test data
probs = paddle.infer(
output_layer=y_predict,parmeters=parameters,
input=[item for item in paddle.dataset.uci_housing.test()()])
for i in xrange(len(probs)):
print 'Predicted price:${:,.2f}'.fromat{probs[I][0] * 1000}
PaddlePaddle 實(shí)現(xiàn)
- 加載包
import matplotlib
matplotlib.use{'Agg'}
import matplotlib.predict as pat
import numpy as np
import paddle.v2 as paddle
- 數(shù)據(jù)處理
# 1 dataset 初始化
TRAIN_DATA = None
X_RAW = None
TEST_DATA = None
# 2 數(shù)據(jù)載入
def load_data(filename, feature_num=2,ratio=0.8):
"""
載入數(shù)據(jù)并進(jìn)行處理
Args:
Filename:數(shù)據(jù)儲(chǔ)存文件,從該文件讀取數(shù)據(jù)
feature_num:數(shù)據(jù)特征數(shù)量
ratio 訓(xùn)練集占總數(shù)據(jù)集比例
"""
global TRAIN_DATA谋国,TEST_DATA槽地,X_RAW
# data = np.loadtxt() 表示將數(shù)據(jù)載入后以矩陣或向量的形式存儲(chǔ)在data中
# delimiter = ',' 表示以','為分隔符
data = np.loadtxt(filename,delimiter=',')
X_RAW = data.T[0].copy()
# axis= 0 表示按列計(jì)算
# data.shape[0] 表示data中一共有多少列
maximums,minimums,avgs =data.max(axis=0),data.min(axis=0),data.sum(axis=0)/data.shape[0]
# 歸一化 data[:i] 表示第i列元素
for i in xrange(feature_num-1)
data[:i] = (data[: i] - aves[I])/(maximums[i] - minmums[i])
# offset 用于劃分訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,例如0.8表示訓(xùn)練數(shù)據(jù)集占80%
offset = int(data.shape[0]*ratio)
TRAIN_DATA = data[:offset].copy
TEST_DATA= data[offset:].copy
# 3 讀取訓(xùn)練數(shù)據(jù) 和讀取測(cè)試數(shù)據(jù)
"""
讀取訓(xùn)練數(shù)據(jù)或測(cè)試數(shù)據(jù)芦瘾,服務(wù)于train()和test()
Args:
data_set: 要獲取的數(shù)據(jù)集
Return:
reader:用于獲取訓(xùn)練數(shù)據(jù)集及其標(biāo)簽的生成器
"""
def reader()
"""
一個(gè)reader
Args:
return:
data[:-1],data[-1:] --使用yield 返回生成器
data[:-1]表示前n-1個(gè)元素捌蚊,也就是訓(xùn)練數(shù)據(jù),data[-1:1]表示最后一個(gè)元素近弟,也就是對(duì)應(yīng)的標(biāo)簽
"""
for data in data_set:
yield data[:-1],data[-1:]
return reader
# 4 獲取訓(xùn)練數(shù)據(jù)集
def train():
"""
定義一個(gè)reader 來獲取訓(xùn)練數(shù)據(jù)集及其標(biāo)簽
Args:
Return:
read_data --用于獲取訓(xùn)練數(shù)據(jù)集及其標(biāo)簽的reader
"""
global TRAIN_DATA
load_data('data.txt')
return read_data(TRAIN_DATA)
# 5 獲取測(cè)試數(shù)據(jù)集
def test():
"""
定義一個(gè)reader 來獲取測(cè)試數(shù)據(jù)集及其標(biāo)簽
Args:
Return:
read_data -- 用于獲取測(cè)試數(shù)據(jù)集及其標(biāo)簽的reader
"""
global TEST_DATA
load_data('data.txt')
return read_data(TEST_DATA)
- 搭建神經(jīng)網(wǎng)絡(luò)
# 1 配置網(wǎng)絡(luò)結(jié)構(gòu)
def network_config():
"""
配置網(wǎng)絡(luò)結(jié)構(gòu)
Args:
Retrun:
cost:
parameter:模型參數(shù)
optimizer:優(yōu)化器
feeeding:數(shù)據(jù)映射缅糟,python 字典
"""
# 輸入層 paddle.layer.data 表示數(shù)據(jù)層,name='x':名稱為x_input,
# type=paddle.data_type.dense_vector(1):數(shù)據(jù)類型為1維稠密向量
x_input = paddle.layer.data(name='x',
type=paddle.data_type.dense_vector(1))
# 輸出層:paddle.layer.fc 表示全鏈接層 祷愉,input=x_input 表示該層輸入數(shù)據(jù)層
# size =1:神經(jīng)元個(gè)數(shù)窗宦,act=paddle.activation.Linear(): 激活函數(shù)為L(zhǎng)inear()
# 標(biāo)簽數(shù)據(jù),paddle.layer.data 表示數(shù)據(jù)層二鳄,name='y':名稱為y
y_label = paddle.layer.data(name='y',type=paddle.data_type.dense_vector(1))
# 定義成本函數(shù)為均方差損失函數(shù) square_error_cost
cost = paddle.layer.square_error_cost(input=y_predict,label=y_label)
# 利用cost 創(chuàng)建parameters
parameters = paddle.parameters.create(cost)
# 創(chuàng)建optimizer赴涵,并且初始化momentum,momentum=0 位普通的SGD 優(yōu)化算法
optimizer = paddle.optimizer.Momentum(momnetum=0)
# 數(shù)據(jù)層和數(shù)組索引映射订讼,用于trainer 訓(xùn)練時(shí)喂數(shù)據(jù)
feeding = {'x':0,'y':1}
result = [cost,parameter,optimizer,feeding]
return result
- 初始化 PaddlePaddle
# 初始化 use_gpu=False 表示不用GPU
def main():
# init
paddle.init(use_gpu=False,trainer_count=1)
- 訓(xùn)練模型
# 1 配置網(wǎng)絡(luò)結(jié)構(gòu)和設(shè)置參數(shù)
cost髓窜,parameters,optimizer欺殿,feeding = network_config()
# 2 記錄成本
costs = []
# 3 創(chuàng)建 訓(xùn)練 trainer
traniner = paddle.trainer.SGD(cost=cost,parameters =parameters,update_equation =optimizer )
# 4 定義事件處理器纱烘,打印訓(xùn)練進(jìn)度
def event_handler(event):
"""
事件處理器杨拐,可以根據(jù)訓(xùn)練過程的信息作相應(yīng)操作
Args:
Event:事件對(duì)象,包含event.pass_id,event.batch_id,event.cost等信息
"""
if isinstance(event, paddle.event.EndIteration):
if event.pass_id % 100 = 0:
print "Pass %d,Batch %d,Cost %f" % (
event.pass_id,event.batch_id,event.cost)
costs.append(event.cost)
)
if isinstance(event, paddle.event.EndPass):
result = trainer.test(
reader=paddle.batch(test(),batch_size=2),
feeding=feeding)
print "Test %d,Cost %f" % (event.pass_id,result.cost)
)
# 5 模型訓(xùn)練
# training
trainer.train(
reder=paddle.batch(
paddle.reader.shuffle(train(),but_size=500),
batch_size=256),
feeding=feeding,
event_handler=event_handler,
num_passes = 300)
# 6 打印結(jié)果
print_parameters(parameters)
# 7 展示學(xué)習(xí)曲線
plot_cost(costs)
- 預(yù)測(cè)房?jī)r(jià)
# 1 參數(shù)打印 page 57
def print_parameters(parameters):
"""
打印訓(xùn)練結(jié)果的參數(shù)以及測(cè)試結(jié)果
Args:
Parameters:訓(xùn)練結(jié)果的參數(shù)
Return:
"""
print " Result parameters as below"
theta_a = parateters.get('____fc_layer_0__.w0')[0]
theta_b = parameters.get('___fc_layer_0_.wbias')[0]
x_0 = X_RAW[0]
y_0 = theta_a * TRAIN_DATA[0][0] + theta_b
x_1 = X_RAW[1]
y_1 =theta_a *TRAIN_DATA[1][0] + theta_b
param_a = (y_0 - y_1) / (x_0 - x_1)
param_b = (y_1 - param_a * x_1)
print 'a = ',param_a
print 'b = ',param_b
# 2 展示模型訓(xùn)練曲線 page 58
def_plot_costs(costs):
"""
利用 costs 展示模型的訓(xùn)練曲線
Args:
Cost: 記錄了訓(xùn)練過程的cost變化的list擂啥,每一百次迭代記錄一次
Return:
"""
costs = np.squeeze(costs)
plt.plot(costs)
plt.ylabel('cost')
plt.xlabel('iterations(per hundreds)')
plt.title("house Price Distributions")
plt.show()
plt.savefig("cost.png")
# 3 開始預(yù)測(cè) page 58
if __name__ == '__main__':
main()
- 數(shù)據(jù)可視化
# 繪圖 page 59
import numpy as np
import matplotlib.pyplot as plt
def plot_data(data, a,b):
x = data[:,0]
y = data[:,1]
y_predict = x*a + b;
plt.scatter(x,y,marker='.',c='r',label='True')
plt.title("House Price Distributions")
plt.xlabel('House Area')
plt.ylael('House Proce')
plt.xlim(0,255)
plt.ylim(0,2500)
predict = plt.plot(x,y_predict,lable='Preidict')
plt.legend(loc='upper left')
plt.savefig('result.png')
plt.show()
data = np.loadtxt('data.txt',delimiter=',')
X_RAW = data.T[0].copy()
plot_data(data,7.1,-62.1)