【深度学习】logistic回归模型

目录

神经网络

数据、符号准备:

logistic回归:

损失函数和代价函数:

梯度下降法:

向量化:


神经网络

我们学习深度学习的目的就是用于去训练神经网络,而神经网络是什么呢?我们先来看下面一个基础的生物上的神经元的图片。

【深度学习】logistic回归模型_第1张图片

通常来说,神经元就是处理信息的基础单位,神经元一端传来电信号,经历中间的处理后会输出新的信号,所以总的来说神经元一个信号处理中心。而神经网络就是多个神经元组成的网络,它可以接收不仅一个输入,它也可以不只有一个输出,并且它们还可以堆叠,这样大大增强数据处理能力。而我们深度学习的神经网络系统就起到相似的作用:接收我们输入的数据,在我们预设的系统下执行完输出结果,而这个神经系统也不是一开始就存在的,它需要我们给予它一些数据去训练它,拟合出一套最适合的映射系统。

【深度学习】logistic回归模型_第2张图片

数据、符号:

在深度学习中,我们需要输入数据才能去训练输出数据,而我们需要先去处理这些输入的数据与符号。下面与如何表示一张三通道图片为例(事实上三通道图可以涵盖我们日常中的很多图片)。

【深度学习】logistic回归模型_第3张图片

对于三通道图片中的三个矩阵,我们可以用一个x的特征向量来表示:\begin{bmatrix} 255\\ 231\\ ...\\ 142 \end{bmatrix}这个特征向量x就能包含里面的所有像素点。它的大小n_{x}n,在这里就是5 x 4 x 3。5表示5行、4表示4列、3表示三个通道。而我们的训练集中不只有一张图(例如三张图),所以我们还需要用一个X的矩阵来代表所有的图\begin{bmatrix} |& |& | \\ x_{1}&x_{2} &x_{3} \\ |& | & | \end{bmatrix} 。这个矩阵的列数就是训练集x的个数,即图片的个数m。而对于输出,例如我们需要做的是一个二分类问题,此时我们的输出就是0或1的标志。那么我们需要的输出y对应的就是一个m列的矩阵\begin{bmatrix} y_{1} &y_{2} &y_{3} \end{bmatrix}

logistic回归:

回到之前的二分类例子,我们有m张图片,并且获取了这些图片的特征向量的矩阵,我们需要判断这些图片中是否满足我们某个要求,如是否含有猫这种动物。那么此时我们的每张图片传进模型后的输出就是一个概率。因为概率的大小都是趋于0到1之间的,此时我们就不能利用简单的线性回归来作为输出。我们可以考虑使用logistic回归。logistic回归函数的参数也是一个大小为n的向量,它可以看成是对应每个像素的权重,并且还含有一个b的标量表示偏移。而要实现逻辑回归就需要控制y的输出位于0到1之间,这里利用的方法是实验sigmoid函数,它可以将输出y控制到0-1之间,sigmoid函数如下:

【深度学习】logistic回归模型_第4张图片

它的函数表达式是:y=\frac{1}{1+e^{-x}},我们可以看到这个函数将输出控制在0-1之间。此时我们的logistic回归的表达式就是:\widehat{y}=\sigma (W^{^{T}}x+b),\sigma (x)=\frac{1}{1+e^{-x}}

损失函数和代价函数:

上面我们讨论了logistic回归,我们的目的是要使用这个回归来得到预测输出y,但是我们知道,我们需要一个标准来衡量我们的输出是否好,即训练值中的输出和预测是否一致。而这个衡量标准就是损失函数。对于单个样本,我们定义一个函数loss来计算真实值和预测值的误差:loss = ylog(y\hat{})+(1-y)log(1-y\hat{})

而我们需要统计的是对应于整个数据集中对应所有数据的损失函数,我们利用符号J来表示这个函数,这个函数叫做代价函数。J就直接与我们需要训练的W和b相关:J(W,b) =\frac{1}{m}\sum_{0}^{m}loss(y,y\hat{})

梯度下降法:

之前我们看了代价函数J,我们的目的是需要让它能够变得最少。我们采用的方法就是梯度下降法,即通过求导数的方式将其一步步变化以达到最优解。而我们对于两个变量w和b的处理方式是

w = w - \alpha \frac{\partial J}{\partial w}

b = b - \alpha \frac{\partial J}{\partial b}

上面的两条式子就是用于计算最符合条件(J最小)时的w和b。我们需要变化w和b,使其不断接近最优解,其中式子中的\alpha是代表学习率,它的意义是控制w每次变化时变化的步长,而偏导就是控制每次变化的方向。

关于梯度下降我们常用得到求导方法是链式法则

【深度学习】logistic回归模型_第5张图片

例如我们的训练参数只有W1,W2,输入量是X1和X2。我们需要的是J对b、W1和W2进行求导,而这个过程无疑是一个循序渐进的求导过程,因为输出结果到输入结果之间隔着很多中间量,所以我们求导的时候一般都需要使用到链式法则。

我们先从一个样本开始:先算出这个样本的预测值y\hat{}(a),我们知道:y\hat{}=\sigma (w^{T}x+b),跟据y\hat{}我们可以得到损失函数loss(y,y\hat{}),loss = ylog(y\hat{})+(1-y)log(1-y\hat{}),之后我们可以根据链式法则倒过来求出\frac{dl}{dw_{1}} = (a-y^{1})x_{1},而b和W2也类似。具体过程如下:

【深度学习】logistic回归模型_第6张图片 过程

在得到损失函数后我们就可以进一步求出J(W,b) =\frac{1}{m}\sum_{0}^{m}loss(y,y\hat{})

向量化:

我们知道,在我们进行深度学习时,我们需要使用的数据往往是大量的,就如我们需要计算的损失函数一样,我们需要有m个数据进行处理,并且每个数据可能都有n个特征值,所以我们遍历这些数据时就不能使用for循环这种低效率的方法,我们需要使用到新的方法:向量化。向量化的意思是我们将这些数据变成矩阵运算(例如numpy和Pytorch中的矩阵运算),这样数据运算处理就可以提高效率。

以我们数据集里有m个图片,每个数据的特征向量为n为例,对于单个图片的线性预测方程的解是z = w_{1}x_{_{1}}+w_{2}x_{2}+w_{3}x_{3}+...+w_{n}x_{n}+b。并且我们还要计算m个z的数值,这里利用for循环计算的效率不高,所以采用矩阵的计算方式。具体是将所有的x放到一个矩阵中:X=\begin{bmatrix} |& |& | \\ x_{1}&x_{2} &x_{3} \\ |& | & | \end{bmatrix}。这个矩阵大小为m x n,这也就代表着一列代表一张图片的特征向量,列数就代表着图片的个数。然后我们将w设计为一个n x 1的向量:w^{T} = \begin{bmatrix} w_{1} &w_{2} &.. &w_{ n} \end{bmatrix},那么w_{1}x_{_{1}}+w_{2}x_{2}+w_{3}x_{3}+...+w_{n}x_{n}就可以表示为:Z = w^{T}X\begin{bmatrix} w_{1}x_{_{1}}^{1}+w_{2}x_{2}^{1}+...+w_{n}x_{n}^{1}&w_{1}x_{_{1}}^{2}+w_{2}x_{2}^{2}+...+w_{n}x_{n}^{2} & ... &w_{1}x_{_{1}}^{m}+w_{2}x_{2}^{m}+...+w_{n}x_{n}^{m} \end{bmatrix}。后面只需要再设计一个b的大小为1 x m的向量与之前的w^{T}X相加即可。这样就可以得到回归预测函数的输出向量Z,后面我们将其带入到激活函数sigmoid后就可以得到预测的输出a。值得注意的是,对于我们之前设计的对于m个样本每个都使用for循环进行一次计算的方法我们也可以将其转换为向量化计算:对于\frac{dJ}{db},我们由上面的链式法则知道是\frac{1}{m}\sum_{0}^{m}dz_{i},这也就代表着我们还有一个循环需要向量化,遍历整个数据集。这里我们可以使用向量化的操作:\frac{dJ}{db}=\frac{1}{m}torch.sum(dZ)即使用Pytorch里的矩阵求和求和操作来计算。同理w也可以化为:\frac{dJ}{dw_{i}}=\frac{1}{m}XdZ^{T},这里的Z转置是为了计算。我们可以大致看看结果:X是一个n行m列n x m的矩阵,Z我们求出来是一个1 x m的行向量。这两个相乘就可以得到一个n x 1的矩阵,它的每一行就代表w_{i}在这m个样本中的累计值。


参考资料:

[双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili

你可能感兴趣的:(深度学习,深度学习,人工智能,python)