http://blog.csdn.net/u011239443/article/details/78048424
对于机器学习的问题,有一部分可以通过数学推导的方式直接得到用公式表达的解析解,但对绝大多数的问题来说,解析解是不存在的,需要使用迭代更新的方法求数值解。然而实数的精度是无限的,而计算机能够表达的精度是有限的,这就涉及到许多数值计算方法的问题。
病态条件:条件数指的是函数相对于输入的微小变化而变化的快慢程度,输入被轻微扰动而迅速改变的函数对于科学计算来说可能会出现问题。
- 全局最小点:在函数的定义域上取得全局最小值的点,这通常来说是许多机器学习问题所要寻找的优化目标点。对神经网络中问题的损失函数来说,可能存在很多的的局部最小点,它们与全局的最小点差距不大,应此通常也可以作为问题的解,下面是一个示例。
numpy实现上述过求解的代码:
import numpy as np
import matplotlib.pyplot as plt
## 定义w和b
feature_num = 10
w_real = np.random.random(feature_num)
b_real = np.random.random()
## 生成训练数据
instance_num = 1000
X = np.random.uniform(-100,100,(feature_num, instance_num))
y = np.matmul(w_real, X) + b_real
y = y + np.random.random(y.shape)
## 初始化参数
w = np.random.random(feature_num)
b = np.random.random()
iter_time = 20
step_size = 0.0001
loss_value = []
## 迭代求解
for i in range(iter_time):
delta = np.matmul(w, X) + b_real - y
loss_value.append((delta*delta).mean())
w = w - step_size*(np.matmul(delta, X.T))/instance_num
b = b - step_size*delta.mean()
plt.clf
plt.plot(np.array(loss_value[1:]))
plt.show()
损失变化情况,如下图示:
>>>w
array([ 0.79842335, 0.42003747, 0.04151777, 0.05549998, 0.71396875,
0.60893848, 0.19337114, 0.42662969, 0.27833712, 0.63035355])
>>>w_real
array([ 0.79855966, 0.41969485, 0.04192018, 0.05457261, 0.7145736 ,
0.60895623, 0.19295485, 0.42620365, 0.27826274, 0.63047412])
有时候,在 x 的所有可能值下最大化或最小化一个函数 f(x) 不是我们所希望的。相反,我们可能希望在 x 的某些集合 S 中找 f(x) 的最大值或最小值。这被称为约束优化(constrained optimization)。
关于 x 对 Lagrangian 微分,我们得到方程: