张春成
2023/01/01阅读:22主题:默认主题
记MLP的一次回归失败
记MLP的一次回归失败
多层感知机(MLP)是常用的神经网络结构,在数学上证明它可以用来表达几乎全部连续函数。
但由于函数的复杂性和训练算法设计的不足,它有时候并不能很好地完成给定的任务。
本文是记录一次用 MLP 进行回归的失败尝试,代码可见我的 GITHUB 仓库
https://github.com/listenzcc/MLP-notebook[1]
回归命题
我要解决的问题很简单,是想设计一个 MLP 网络 ,用它完成一个回归任务
其中映射两端的函数都是连续的复变函数,它们具有相同的形式
其中除参数 之外,其余参数均为常数。因此,不同的参数组合可以用来构造回归任务的自变量和因变量函数
稍加思考便知,形如以上的函数在复平面上构成一组螺旋线,如下图所示。

构造数据的代码如下
def mk_dataframe(x, y, r, theta, name='noname'):
'''
Make dataframe for the dataset
'''
df = pd.DataFrame()
df['x'] = x
df['y'] = y
df['theta'] = theta
df['r'] = r
df['name'] = name
df['idx'] = range(len(df))
return df
# Setup
# 'sample' mark means using the data to train the network
n = 5000
m = 2000
sample = np.random.choice(range(n), m, replace=false)
# src
theta = np.linspace(0, np.pi * 5, n)
r = np.linspace(0.2, 0.8, n)
x = r * np.cos(theta)
y = r * np.sin(theta)
df1 = mk_dataframe(x, y, r, theta, 'src')
df1['sample'] = 'na'
df1.loc[sample, 'sample'] = 'sample'
# target
theta = np.linspace(0, np.pi * 6, n)
r = np.linspace(0.1, 0.9, n)
x = r * np.cos(theta)
y = r * np.sin(theta)
df2 = mk_dataframe(x, y, r, theta, 'target')
df2['sample'] = 'na'
df2.loc[sample, 'sample'] = 'sample'
网络设置
螺旋线的形式看上去很简洁,因此我构造了一个简单的 MLP 网络,试图用它对函数进行回归。基于回归计算的特性,选择 MSE 作为损失函数。因此,网络构造和训练使用的代码如下
# Network generation
class Net(nn.Module):
def __init__(self):
super().__init__()
self.mlp = torchvision.ops.MLP(2, [4, 3, 2], activation_layer=nn.LeakyReLU)
self.sig = nn.Tanh()
def forward(self, x):
return self.sig(self.mlp(x))
net = Net().cuda()
# Network training
lr = 1e-2
optimizer = torch.optim.AdamW(net.parameters(), lr)
criterion = nn.MSELoss()
实验结果
然而,实验结果令我有点吃惊,因为网络参数虽然收敛,但并没有完成回归任务。
Step | Loss(train) | Loss(test) |
---|---|---|
0960 | 0.0280 | 0.0251 |
0970 | 0.0213 | 0.0251 |
0980 | 0.0223 | 0.0251 |
0990 | 0.0234 | 0.0254 |
回归效果如下图所示,图中红色和绿色曲线分别代表回归方程的左侧和右侧变量,图中蓝色和紫色曲线分别代表回归结果和差异曲线。可见,回归效果不佳。

接下来,为了考察效果不佳的位置在哪里,我将点云顺序作为第三个维度绘制出来,这样相同层面的数据之间就具有可比性,从下面的图中可以看到,回归结果虽然差异较大,但 MLP 仍然是以特定的“螺旋形”进行回归的,只是没有得到最正确的那组参数。
但是我最终也没有想明白这其中的数学原理是什么。不兴趣的小伙伴可以移步我的代码库,其中有可交互的 3D 图
Experiment of MLP[2]
下图中不同颜色的曲线与上图中的意义相同。


接下来,我们忽略曲线差异,用不同的颜色代表点的顺序,如下图所示。


参考资料
https://github.com/listenzcc/MLP-notebook: https://github.com/listenzcc/MLP-notebook
[2]Experiment of mlp: https://listenzcc.github.io/MLP-notebook/
作者介绍