Advanced Learning Algorithms

机器学习-高级学习算法

课程简介

In the second course of the Machine Learning Specialization, you will:

• Build and train a neural network with TensorFlow to perform multi-class classification
• Apply best practices for machine learning development so that your models generalize to data and tasks in the real world
• Build and use decision trees and tree ensemble methods, including random forests and boosted trees

The Machine Learning Specialization is a foundational online program created in collaboration between DeepLearning.AI and Stanford Online. In this beginner-friendly program, you will learn the fundamentals of machine learning and how to use these techniques to build real-world AI applications.

This Specialization is taught by Andrew Ng, an AI visionary who has led critical research at Stanford University and groundbreaking work at Google Brain, Baidu, and Landing.AI to advance the AI field.

This 3-course Specialization is an updated and expanded version of Andrew’s pioneering Machine Learning course, rated 4.9 out of 5 and taken by over 4.8 million learners since it launched in 2012.

It provides a broad introduction to modern machine learning, including supervised learning (multiple linear regression, logistic regression, neural networks, and decision trees), unsupervised learning (clustering, dimensionality reduction, recommender systems), and some of the best practices used in Silicon Valley for artificial intelligence and machine learning innovation (evaluating and tuning models, taking a data-centric approach to improving performance, and more.)

By the end of this Specialization, you will have mastered key theoretical concepts and gained the practical know-how to quickly and powerfully apply machine learning to challenging real-world problems. If you’re looking to break into AI or build a career in machine learning, the new Machine Learning Specialization is the best place to start.

生物神经网络

生物神经元:通过树突接收到来自不同地方的输入,然后通过轴突将神经冲动传递出去。

但是目前对于人脑的运作方式了解的还不是很透彻。

Tensorflow搭建神经网络

  1. 定义神经网络:
model = Sequential(
    [   
        tf.keras.Input(shape=(400,)),    #specify input size
        tf.keras.layers.Dense(25, activation='sigmoid'),
        tf.keras.layers.Dense(15, activation='sigmoid'),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ], name = "my_model" 
)
  1. 训练神经网络
model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(),
    optimizer=tf.keras.optimizers.Adam(0.001),
)

model.fit(
    X,y,
    epochs=20
)
  1. 预测
prediction = model.predict(X[0].reshape(1,400))  # a zero
print(f" predicting a zero: {prediction}")
prediction = model.predict(X[500].reshape(1,400))  # a one
print(f" predicting a one:  {prediction}")

Python搭建神经网络

  1. 定义网络层
def my_dense_v(A_in, W, b, g):
    """
    Computes dense layer
    Args:
      A_in (ndarray (m,n)) : Data, m examples, n features each
      W    (ndarray (n,j)) : Weight matrix, n features per unit, j units
      b    (ndarray (1,j)) : bias vector, j units  
      g    activation function (e.g. sigmoid, relu..)
    Returns
      A_out (ndarray (m,j)) : m examples, j units
    """
    z = np.matmul(A_in,W)+b
    A_out = g(z)
    return(A_out)
  1. 组合不同的层
def my_sequential_v(X, W1, b1, W2, b2, W3, b3):
    A1 = my_dense_v(X,  W1, b1, sigmoid)
    A2 = my_dense_v(A1, W2, b2, sigmoid)
    A3 = my_dense_v(A2, W3, b3, sigmoid)
    return(A3)
  1. 预测
Prediction = my_sequential_v(X, W1_tmp, b1_tmp, W2_tmp, b2_tmp, W3_tmp, b3_tmp )
Prediction.shape

通用人工智能(AGI)

人工智能(AI)可以分为两种,ANI和AGI:

ANI指在某一特定领域应用的人工智能,目前已经取得了很好的效果;

AGI指通用人工智能,人工智能可以做任何人类可以做到的事情。

鉴于对人脑的了解还不够,如果通过模拟人脑的方式达到通用人工智能比较困难。

不过目前有一些进展,让通用人工智能看到了一点点希望。

训练神经网络

  1. 决定输入变量、模型的数学形式、参数以及最终输出的结果形式
  2. 定义损失函数和代价函数(损失函数是针对一个训练样本而言的,代价函数是结合全部训练数据的损失函数得来的)
  3. 在数据上使用某种方法(如梯度下降法)进行训练,从而使代价函数最小

激活函数

如果不使用激活函数,那么不管多么复杂的神经网络都会退化成线性回归方法可以实现的效果。

Sigmoid激活函数:

ReLU激活函数:

如何选择输出层的激活函数:

  1. 二分类问题,选择Sigmiod激活函数
  2. 线性回归问题不使用激活函数,如果确保没有负数值出现,可以使用ReLU激活函数

隐藏层中大多数使用ReLU激活函数而非Sigmoid激活函数

  1. ReLU激活函数比Sigmoid激活函数计算更快
  2. ReLU激活函数与x轴平行的部分更少,使用梯度下降算法运行更快

多类别分类

多类别分类是指输出不止两种情况的分类问题,如对手写数字进行分类,输出的类别会有10个

可以使用Softmax回归算法:

损失函数:,也就是

多标签分类:可以看成很多多类别分类问题,也可以使用一个神经网络预测所有的类别

优化方法

Adam优化方法:自动调节学习率

如果梯度下降的方向一直是同一方向则增大学习率,让算法运行更快

如果梯度下降的方向一直在波动,则减小学习率。

机器学习问题诊断

如果发现训练好的模型在预测上存在很大的问题,可以从以下几个方面入手查找原因:

  1. 采集更多的训练样本——高方差
  2. 尝试减小特征数目——高方差
  3. 尝试增加额外的特征——高偏差
  4. 尝试增加一些其他多项式的特征,如等等——高偏差
  5. 尝试增加或减少正则项——高方差、高偏差

训练时对训练集进行划分,可以划分为训练集和测试集,如果希望使用交叉验证的方式,可以划分为训练集、验证集和测试集。通过测试集的表型评估模型的效果。模型的选择上,可以从多项式的次数从低到高依次进行选择,找出测试集误差最小的模型。

更大规模的神经网络的偏差往往更小

如果恰当选择正则化参数,更大规模的神经网络的表现比小规模的神经网络表现更好

偏差和方差

欠拟合:函数对于训练集的拟合效果不好——高偏差(high bias)

过拟合:函数对于训练集的拟合效果好,对于测试集的效果不好——高方差(high variance)

避免过拟合的方法:

  1. 收集更多的训练数据
  2. 从全部的特征中挑选最相关的特征进行训练
  3. 正则化——减小某一参数对拟合函数的影响

正则项参数对模型的影响

  1. 太大的导致模型的训练集拟合效果不好——高偏差(high bias)
  2. 太小的导致模型对于训练集的拟合效果好,对于测试集的效果不好——高方差(high variance)

学习曲线:

  1. 正常的学习曲线,随着训练集样本数量的增加,训练集的误差会逐渐增大,验证集的误差会逐渐减小,但是验证集的误差会始终大于训练集的误差
  2. 如果一个模型偏差比较大,增加更多的训练数据不会帮助提升效果
  3. 如果一个模型的方差比较大,可以考虑增加更多的训练数据

评价分类(尤其针对分布不平衡的数据)

决策树

熵(Entropy)

信息增益

  1. 在根结点处使用所有的数据示例
  2. 对每一种可能的分类方式计算信息增益,选择信息增益最高的分类方式
  3. 使用上一步选择的分类方式对数据进行划分,划分成为左子树和右子树
  4. 重复上述的操作,直到①某一个节点仅有一种类别②决策树高度超过阈值③信息增益小于阈值

如果一个决策结点有三个可选项,可以通过独热编码的方式将其转换为多个二分类形式。

如果变量是连续的数值,可以计算从那里开始划分的信息增益最高,从而转化为判断大小于的二分类形式。

决策树解决回归问题,则将熵替换为节点上数据的方差进行计算。

随机森林:

  1. 有放回采样训练数据,并且分别使用采样后的训练数据训练决策树
  2. 为了使决策树的决策结点不完全相同,每一次选取特征的时候只选取一部分子集的特征
  3. 最后使用投票法确定最终的分类

XGBoost:采样训练数据的时候更倾向于采样前面的树中被分类错误的数据

决策树更适用于结构化的数据,快速,但是不适用于其他类似于图片文本等的数据

神经网络适用于所有类型的数据,运行可能稍慢一些,可以迁移学习,更适合将不同的神经网络结合到一起。

资料

第一周课件和代码

Notebooks Week 1

第二周课件和代码

Notebooks Week 2

第三周课件

第四周课件

作业代码

Exercise 1

Exercise 2

Exercise 3

Exercise 4


Advanced Learning Algorithms
https://zhangzhao219.github.io/2022/08/01/Coursera/Advanced-Learning-Algorithms/
作者
Zhang Zhao
发布于
2022年8月1日
许可协议