Logistic Regression as a Neural Network
Binary Classification
视频中的例子: 给一张64x64像素的图片图片,判断是否含有猫
1、获取图片的RGB像素值
2、并unroll成一个vector
3、所有的vector组成数据集矩阵
特别注意,(X)的行是(n),列是(m),和Machine learning中的定义正好是转置的关系。这样有个好处,每条测试集在矩阵中都是以列向量的形式存在。
完整的notation,可以参考课程中提供的PDF: Standard notations for Deep Learning
Logistic Regression
1、问题描述:
Logsitic Regression要求输出y不是0就是1。The goal of logistic regression is to minimize the error between its predictions and training data.
2、sigmoid function
3、引入参数w, b,其实就是Machine learning中用的是θ,但DeepLearning中分别用w和b表示。其中w是vector,b是real number
4、这里 𝑦̂ 就是Machine learning里面的hypothesis function: h(θ)
Logistic Regression Cost Funciton
Gradient Descent
原理:按梯度最大的方向逼近最小值。
Logistic Regression Gradient Descent
虽然,测试集是离散的,但并不代表对w的倒数是离散的,这两者没有任何关系。始终注意:在gradient Descent的时候,x是常量
Gradient Descent on m Examples
Gradient Descent算法过程:
1、求导过程
求导过程又通常是先forward propagation求cost function,然后再backward propagation求到w和b的倒数
2、下降过程
使用到w和b的导数,迭代做梯度下降过程。
下面的截图就是一个非向量化的实现:左边是求导过程,右边是梯度下降过程
Python and Vectorization
Vectorization
即为转化成矩阵计算,可以有效地加快计算速度
并且CPU和GPU都更加擅于并行计算
More vectorization Examples
原则:whenever possible, avoid explict for-loops
使用Element wised的矩阵运算,将函数作用在每个矩阵元素上,比如:
np.exp()
np.log()
np.abs()
np.maxium()
1/v
v**2
Vectorizing logistic Regression
Vectorizing Logistic Regression’s Gradient Output
Broadcasting in Python
在matlab和Python中,都默认支持不同维度的变量做element-wised的计算(±x/等)。所谓Broadcasting其实就是高纬度数组和低纬度数组计算时,将低维的变量通过复制的方式向高维扩展维度,再做运算。但要注意:
低纬度数组与高纬度共有的维度,元素个数必须一样,比如一个shape是(5,3)的数组可以和一个shape是(5,)的数组相加,但不能和一个(4,)的数组相加。
维度相同的数组的数组,是不能broadcasting的,比如一个shape是(5,3)的数组和一个shape是(5,2)的数组运算,后者是无法broadcasting的
某个维度的个数是1,等同于这个维度不存在,可以broadcasting,比如shape是(5,3)和(5,1)的数组可以运算。
总的来说,就是broadcasting要做某个维度的复制,必须在赋值的时候行得通。比如shape是(5,3)和shape是(5,2)的数组运算,后者要将2复制为3是行不通的,因为存在两行,那取哪一行?
Andrew的一个经验:如果对某个数组的shape不确定,可以用reshape显式的调用一下,确保维度正确。
补充:numpy中,类似sum的函数,经常涉及axis参数,可以取值为0或1,甚至其他。经常记不住,这里我查了了一下,是这样的(原文):
axis的数字,和数组的shape参数的索引是对应的。比如一个数组的shape是(5,6),则代表5个row,6个column。即在shape中,row和column的个数的索引是0和1。也就第1个坐标,在shape中的第一个元素,索引是0,代表row的方向;第2个坐标,在shape中的第2个元素,索引是1,代表row的方向。
对于sum函数,axis指的是sum“沿着”的方向,经过计算,这个方向的维度因为求和后就消失了,比如sum(axis=0)代表是沿着“row”方向进行求和,
当然axis可以是一个tupe,那就相当于沿着多个多个方向求和。
sum如果不传入axis参数,默认是对所有维度求和。
A note on python/numpy vectors
broadcasting的一个弱点:可能隐藏潜在的错误,比如一个计算中本来要去两个运算的数组维度一样,如果没有broadcasting,就会直接报错;而broadcasting允许可继续执行。
rank 1 array问题:shape是(x,)的数组,既不是行向量,也不是列向量,没法参与正常的矩阵运算,应该总是使用(x,1)或(1,x)的shape来表示向量。但可以通过reshape方法将rank 1 array转换为行向量或列向量。(什么是rank,就是一个数组的维度)