数据集

HAR
该数据集包含561个特征,拥有6个分类.共10299条数据. 利用智能手机,通过加速度计和陀螺仪,以50HZ的频率采样得到3维的加速度和角速度信息.

LogisticRegression

对附近10个数据做平均

SVM

相关论文使用SVM做分类器.

单隐层

结构

Sequential(
(0): Linear(in_features=561, out_features=600, bias=True)
(1): Sigmoid()
(2): Linear(in_features=600, out_features=6, bias=True)
)

结构

Sequential(
(0): Linear(in_features=561, out_features=600, bias=True)
(1): Tanh()
(2): Linear(in_features=600, out_features=6, bias=True)
)

loss

结构

Sequential(
(0): Linear(in_features=561, out_features=600, bias=True)
(1): ReLU()
(2): Linear(in_features=600, out_features=6, bias=True)
)

KSelection

首先分析数据的分布情况.
神经元激活的比例(前5个),ac为tanh
平均占比也有0.98.且采用logistic regression也取得了不错的结果.由此可见有很大一块区域为线性的.

首先使用d=0.2的KTanh做尝试.
confusion matrix
loss
前5给神经元的k值

问题
k值震荡震荡神经元的t值

而在简单任务(sin x)的学习中的:
tk

我想写一篇关于修改数据分布提升神经网络性能的文章.我认为神经网络是通过选择数据中的部分关键数据,不断进行筛选,汇总,最后达到极高的性能.

http://ssci2019.org/

资料:

拟合能力
Batch normalization
BN 为什么效果好?
Efficiency BP
数据处理:白化、去均值、归一化、PCA
Covariate Shift : Covariate Shift Adaptation by Importance Weighted Cross Validation

技术

实验

sigmoid, d = 0.1

信息留存百分比缩放比k

Relu

ReLU是非饱和的非线性函数,因此无法通过缩放区间来增加或者减少数据容量.只能通过移动bias来修改容量.由于很难判断那个方向是增加或者减少数据容量,所以通过试验法.
net1为ReLU,net1在ReLU前增加偏置
上为占比,下为bias,有16个神经元失效(占比为0)

tanh

$$ tanh(k x)/k$$
在缩放区间的同时,尽量保持原来部分的形状.

使用MNIST训练, 下面是采用非缩放情况下的tanh.
Test set: Average loss: 0.1510, Accuracy: 9567/10000 (96%)
losses
t,平均占比在0.9以上

d=0.9缩放
Test set: Average loss: 0.1180, Accuracy: 9659/10000 (97%)
losses
t,平均0.88
k,收敛慢

如果把神经网络分为选择重构两个部分,神经网络能够不断剔除无用信息(针对任务),保留有效信息,从而归结出结论(识别或者回归).那么可不可以通过修改选择来提升网络性能?

KSelection

在神经网络激活函数前增加一系数k:
$$g(kZ),Z = w x +b$$
假设g为sigmoid.k越大,则其有效区域越小;反之越大.
$$ len=\frac{8}{k
w}, center = -b/w$$
k可以改变有效区域长度,而不改变其中心.

选择部分有用信息

如果眼前的图像太小怎么办呢?放大!

我假设一组数据中只有20%是有用的. 那么可以通过修改k的值,修改数据的分布,使其20%落在有效区域上.

1
2
3
4
5
6
def f(x):
res = x.clone()
t = x[x >= 0.2]
res[x >= 0.2] = 1 + 1*(t - 0.2) ** 3
t = x[x < 0.2]
res[x < 0.2] = 1 + 20*(t - 0.2) ** 3

实验

均有分布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def efficiency_range(linear):
with torch.no_grad():
return (-linear.bias) / linear.weight.flatten()

def showNet(model):
X = torch.linspace(-1,1,1000).reshape(-1,1)
y = model(X)
plt.plot(X.numpy(), y.detach().numpy())

mid =60
net = nn.Sequential(
nn.Linear(1,mid),
nn.Sigmoid(),
nn.Linear(mid,1)
)

net1 = nn.Sequential(
nn.Linear(1,mid),
SAAC(mid),
nn.Linear(mid,1)

)

X = torch.linspace(-1,1,1000).reshape(-1,1)

plt.plot(X.numpy(),(torch.sin(10*X)).numpy())

loss_fun = nn.MSELoss()
opt = optim.Adam(net.parameters())
rec=[]
for i in range(10001):
X = torch.linspace(-1,1,1000).reshape(-1,1)
Y = torch.sin(10*X)
pred = net(X)
loss = loss_fun(pred,Y)
opt.zero_grad()
loss.backward()
opt.step()
if i % 100==0:
print(f'{i}-loss: {loss}')
rec.append(loss.item())

showNet(net)
rec1=[]
loss_fun = nn.MSELoss()
opt = optim.Adam(net1.parameters())
for i in range(2001):
X = torch.linspace(-1,1,200).reshape(-1,1)
Y = torch.sin(10*X)
pred = net1(X)
loss = loss_fun(pred,Y)
opt.zero_grad()
loss.backward()
opt.step()
if i % 100==0:
print(f'{i}-loss: {loss}')
rec1.append(loss.item())

showNet(net1)
plt.legend(['sin(10x)','net','net1'])

loss,蓝色为普通方法
使用KSelection后提升了5倍的速度,取得了同样的结果.

有偏样本

样本不再是[-1,1]之间的均有分布,而是distributions.normal.Normal(0,1)的正态分布.两个网络用同样的方法训练10001次

可以看到,用普通的方法网络无法收敛,而KSelection则缓慢地收敛.

使用更少的神经元

将隐层神经元改为10.