例如,对于一个简单的线性模型y=wx+b
,其中x
和y
分别是输入和输出,w
和b
是训练参数,我想知道,在每个epoch,我如何先更新b
,然后更新w
?
Tensorflow可能不是最好的工具。你可以用python来做。
如果你需要用一个更复杂的函数做回归,scikit-learn可能是一个更合适的库。
无论使用什么工具,都可以使用批量梯度下降或随机梯度下降。
但首先你需要定义一个"成本函数",这个函数基本上告诉你离真实值有多远,例如最小均方(LMS),这种类型的函数从你的模型和真实值中获取预测,并对训练参数进行调整。
这是由BGD或SGD在训练过程中优化的函数。
这是我做的一个例子来理解正在发生的事情,它不是最优的解决方案,但它会让你了解正在发生的事情。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
alpha = 0.00005
thetas = np.array([1.,1.])
def h(thetas, x):
#print(f'theta 0: {thetas[0]}')
#print(f'theta 1: {thetas[1]}')
#print(f'h=m:{thetas[0] + (thetas[1]*x[1])}')
return thetas[0] + (thetas[1]*x[1])
for i in zip(tips.total_bill, tips.tip):
x = np.array([1, i[0]])
y = i[1]
for index, theta in enumerate(thetas):
#print(f'theta in: {thetas[index]}')
#print(f'error: {thetas[index] + alpha*(y - h(thetas, x))*x[index]}')
thetas[index] = thetas[index] + alpha*(y - h(thetas, x))*x[index]
#print(f'theta out: {thetas[index]}')
#print(thetas)
print(thetas)
xplot = np.linspace(min(tips.total_bill), max(tips.total_bill), 100, endpoint=True)
xp = [[1,x] for x in xplot]
yp = [h(thetas, xi) for xi in xp]
plt.scatter(tips.total_bill,tips.tip)
plt.plot(xplot, yp, 'o', color= 'orange')
plt.show()
不太可能。TF的backprop基于前向prop时其他变量的值计算所有变量之间的梯度。如果你想在训练w和b之间交替,你将解冻w和冻结b(将其设置为trainable=False),向前推进和向后推进,然后冻结w和解冻b,向前推进和向后推进。我不认为这会运行得很快,因为TF的设计并不是为了在每个小批量上切换可训练标志。