注意:通过对函数取对数,我们便得到了对数似然值(log-likelihood),我们确保我们的目标函数是严格的凸函数(这是一项附加条件),这意味着它有一个全局最大值。 数学:单变量的牛顿法 在我们最大化对数似然函数之前,需要介绍一下牛顿法。 牛顿法是迭代式的方程求解方法;它是用来求解多项式函数的根的方法。在简单的、单变量的情况下,牛顿法可以通过以下步骤来实现; 求取函数 f(x) 在点 (xn,yn) 处的切线: 求取点 x_n+1, 处的切线的在 x 轴的截距: 求出 x 截距处的 y 值 如果 yn+1−yn≈0:返回 yn+1,因为我们的结果已经收敛了! 否则,更新点 (xn,yn),继续迭代: 下面的动图有助于我们可视化这个方法: 如果你能够更详细地理解上述算法,你将看到这个可以归结为: 任何一位通过高中数学考试的人都能够理解上面的内容。但是我们如何将其推广到多变量的「n 维」情况中呢? 数学:N 维问题中的牛顿法 说到 n 维情况,我们用一个叫做梯度的偏微分向量来代替单变量微分。 如果这个概念对你而言有些模糊,那么请复习一下梯度的知识。 所以在多变量的形式中,我们的更新规则变成了参数 x^ 的向量减去 f(x^),如下所示: 注意: f(xn)f′(xn) 中的 f′(xn) 变成了 ∇f(x^n)^(−1),j2直播,因为我们将标量 f(xn) 推广到了多变量的情况下,将它变成了梯度的倒数 ∇f(x^n)^(−1)。 数学:用牛顿法最大化对数似然函数 我们要最大化假设函数 hθ(x) 的对数似然值ℓ(θ)。 为了最大化我们的函数,我们要找到函数 f ℓ(θ) 的偏微分,并且将它设为 0,然后从中求出 θ1 和 θ2,来得到微分的临界点。这个临界点就是对数似然函数的最大值点。 注意:因为对数似然函数是严格的凸函数,所以我们会有一个全局最大值。这意味着我们只有一个临界点,所以通过上述方法得到的解就是我们的唯一解。 这应该听起来很熟悉。我们寻求使偏微分为 0 的 θ1 和 θ2。我们找到了梯度向量的根。我们可以使用牛顿法来做这件事!回想一下牛顿法的更新步骤: 我们可以用梯度来代替 f(x^n),这样就得到了: 那么上面的「?」指的是什么呢?直觉告诉我们,我们需要对梯度向量求导,就像我们之前对 f(x^n) 所做的微分一样。 开始进入海森矩阵(The Hessian)。 数学:海森矩阵 从关于多元微分的预备知识中可以得知,我们应该知道去求解一个函数的「二阶」导数,我们针对每一个参数再给每个一阶偏导数求偏导数。如果我们有 n 个参数,那么我们就会有 n^2 个二阶偏导数。 结果就是,海森矩阵是一个 n*n 的二阶偏导方阵。 在我们的情况中,一共有两个参数 (θ1,θ2),因此我们的海森矩阵形式如下: 数学:将所有的放在一起 将海森矩阵替换在牛顿法的更新步骤中,我们得到了如下所示的内容: 注意:我们取了海森矩阵的逆矩阵,而不是它的倒数,因为它是一个矩阵。 为了简单起见,这篇文章省略了对梯度和海森矩阵进行求导的实际过程。要理解后面的求导过程可以参考下面的资源: 1. 我们的对数似然函数的梯度的导数(Derivation of the Gradient of our Log-Likelihood), 吴恩达课程笔记 17-18 页 2. 海森矩阵的求解其实相当直接,如果你曾经计算过梯度,你会在吴恩达课件笔记中「对 sigmoid 函数求导 g′(z)」那一部分看到。 ℓ(θ) 的梯度是: ℓ(θ) 的海森矩阵是: 其中: 实现牛顿法 我们从定义假设函数开始,它就是 sigmoid 函数: def sigmoid(x, Θ_1, Θ_2): z = (Θ_1*x + Θ_2).astype("float_") return 1.0 / (1.0 + np.exp(-z)) 然后定义我们的对数似然函数 ℓ(θ): def log_likelihood(x, y, Θ_1, Θ_2): sigmoid_probs = sigmoid(x, Θ_1, Θ_2) return np.sum(y * np.log(sigmoid_probs) + (1 - y) * np.log(1 - sigmoid_probs)) 最后,我们实现对对数似然函数的梯度求解和海森矩阵求解: (责任编辑:本港台直播) |