多分类问题可以转换为多个二分类问题,例如,需要完成对手写数字的十分类时,可以采用依次对每个数字(0-9)进行二分类的方式,最终对每次分类中计算出的正样本概率值进行排序,选择概率最高的数字作为分类的结果。
整个过程需要训练10个分类模型(0-9这十个数字每个数字训练一个分类模型),若模型的输入为数字x,则分别使用这10个模型对x进行分类,对每次分类的逻辑回归输出值(即正样本的概率)进行排序,取最大的值所对应的标签作为最终的分类结果。
首先,采用Sigmoid函数作为逻辑回归的激活函数:
代码实现如下:
def logistic(X):
if(X>=0):
return 1.0 / (1.0 + np.exp(-X))
else:
return np.exp(X)/(1.0 + np.exp(X))
采用交叉熵作为损失函数,在二分类下,交叉熵损失函数如下:
代码实现如下:
def cross_entropy(Y, P):
Y = np.float_(Y)
P = np.float_(P)
return -np.sum(Y * np.log(P + 1e-10) + (1 - Y) * np.log(1 - P + 1e-10))
L对权重w的偏导数为:(logistic - y)* x , 其中logistic为前向传播经过Sigmoid函数激活后的值,其范围在0到1之间。
L对偏置b的偏导数为:(logistic - y)
故在反向传播中,参数w和b的更新如下:
def backward(w,b,data,y,logistic,l_rate):
for i in range(len(w)):
w[i] -= l_rate * (logistic - y)*data[i]
b -= l_rate * (logistic - y)
return (w,b)
其中l_rate为学习率
模型的训练过程如下(每个训练样本更新一次权重,每个epoch执行一次评估):
def train(epoch,l_rate,num):
training_data, validation_data, test_data = get_binary_classification_data(num)
w,b = init_weight()