多层感知机
多层感知机(multilayer perceptron,简称 MLP),多层神经网络模型。
隐藏层多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层介于输入层和输出层之间。
包含单个隐藏层的多层感知机设计:
$$H = XW_h + b_h$$
$$O = HW_o + b_o$$
将隐藏层的输出直接作为输入层的输入。两个式子联立起来,得到:
$$O = (XW_h + b_h)W_o + b_o = XW_hW_0 + b_hW_o + b_o$$
可以看出,虽然引入了隐藏层,却依然等价与一个单层神经网络:其中输出层权重参数为$W_hW_o$,偏置参数为$b_hW_o + b_o$。即便添加再多的隐藏层,以上设计依然等价与一个单层神经网络。
激活函数上述问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加依然是一个仿射变换。解决问题的一个方法是引入一个非线性变换,例如对隐藏层变量使用按元素操作的非线性函数进行变换,然后作为下一个全连接层的输入。这个非 ...
softmax回归的Gluon实现
使用MXNet提供的Gluon接口可以更加方便地实现Softmax回归
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566import gluonbook as gbfrom mxnet import gluon, init, autogradfrom mxnet.gluon import loss as gloss, nn# 获取数据batch_size = 256train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)# 定义和初始化模型net = nn.Sequential()net.add(nn.Dense(10))# 使用N(0,1)初始化模型权重参数net.initialize(init.Normal(sigma=0.01))# softmax和交叉熵损失函数loss = gloss.SoftmaxCrossE ...
softmax回归的实现
softmax回归的实现与线性回归的实现非常相似。同样使用小批量随机梯度下降来优化模型的损失函数。在训练模型是,迭代周期num_epochs和学习率lr都是可以调节的参数。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596import gluonbook as gbfrom mxnet import autograd, ndbatch_size = 256train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)# 输入向量28x28x1 (宽28 高28 灰度)num_input = 784# 输出向量 10个分类num_output = 10# 权重初始化weight = nd.random.norm ...
Fashion-MNIST数据集
简介Fashion-MNIST是一个替代手写数字集的图像数据集,比手写数据集更加复杂。它是由Zalando旗下的研究部门提供。
特征
60000张训练图像和标签数据
10000张测试图像和标签数据
10个类别
每张图片28x28分辨率
灰度图片
类别如下:
标注编号
描述
0
T-shirt/top
1
Trouser
2
Pullover
3
Dress
4
Coat
5
Sandal
6
Shirt
7
Sneaker
8
Bag
9
Ankle boot
获取数据集通过mxnet.gluon的data包来下载这个数据集。第一次调用会从网上获取数据。
1234567891011from mxnet.gluon import data as gdatamnist_train = gdata.vision.FashionMNIST(train=True)mnist_test = gdata.vision.FashionMNIST(train=True)print(len(mnist_train))print(len(mni ...
Softmax回归
和线性回归不同,Softmax回归的输出单元从一个变成了多个,且引入了softmax运算使得输出更适合离散值的预测和训练。
分类问题假设一个简单的图像分类问题,输入的图像为灰度、高和宽分别问两个像素。这样每个像素都可以用一个标量来表示。将图像的四个像素分别记为$x_1,x_2,x_3,x_4$,假设这些训练集中图像的真实标签为狗、猫和猪(假设四个像素可以表示出这三种动物),这些标签分别对应离散值$y_1,y_2,y_3$。
通常用离散的数值来表示类别,例如$y_1=1,y_2=2,y_3=3$。这样,一张图像的标签就为1,2和3这三个数值中的一个,虽然可以使回归模型来建模,并叫预测值就近定点化到1,2和3这三个数值中,但是这种连续值到离散值的转化会影响到分类的质量。因此,一般使用更加适合的离散值输出的模型来解决分类问题。
Softmax回归模型softmax回归跟线性回归一样将输入特征与权重做线性叠加。与回归模型的一个主要区别是,softmax回归的输出值个数等于标签里的类别数。因为一共有4个特征和3种输出动物类别,所以权重包含12个标量(带下标的$w$) ...
线性回归的Gluon实现
使用MXNet提供的Gluon接口实现线性回归
mxnet的nn(neural networks)模块定义了大量的神经网络的层。loss模块定义了各种损失函数
MXNet的initializer模块提供了模型参数初始化的各种方法
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980from mxnet import autograd, ndfrom mxnet.gluon import loss as glossfrom mxnet.gluon import data as gdatafrom mxnet.gluon import nn as gnnfrom mxnet import initfrom mxnet import gluon# 生成数据集num_input = 2num_example = 1000true_w = [2, ...
线性回归
简介在统计学中,线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
在线性回归中,数据使用线性预测来建模,并且未知的模型参数也是通过数据来估计的。这些模型被叫做线性模型。
模型以预测房价为例,假设价格指取决于房屋的两个因素:面积(平方米)和房龄(年)。
设房屋的面积是$x_1$,房龄是$x_2$,出售价格是$y$,建立基于输入$x_1$和$x_2$来计算输出$y$的表达式,也就是模型(model)。线性回归假设输出与各输入之间是线性关系:
$$\hat{y}=x_1w_1+x_2w_2+b$$
其实$w_1$,$w_2$是权重(weight),b是偏置(bias),均为标量。它们是线性回归模型的参数(parameter)。模型是输出$\hat{y}$是线性回归对真实价格$y$的预测或估计。通常允许有一定误差。
模型训练然后需要通过数据来寻找特定的模型参数数值,使得模型 ...
mxnet自动求梯度
求梯度实例1234567891011121314151617181920from mxnet import autograd, nd# 对函数y=2x(转置)x 求列向量x的梯度x = nd.arange(4).reshape(4,1)print(x)# 调取attach_grad函数申请计算存储梯度所需的内存x.attach_grad()# record 函数要求mxnet记录求梯度相关的计算with autograd.record(): y = 2 * nd.dot(x.T, x)# 调用backward自动求梯度y.backward()# 梯度应该为4x 验证梯度是否正确assert (x.grad - 4 * x).norm().asscalar() == 0print(x.grad)
训练模式和预测模式调用record函数后,mxnet会记录并计算梯度。此外还将运行模式从预测模式转为训练模式。
12345from mxnet import autogradprint(autograd.is_training())with autograd.record(): p ...
mxnet数据操作
创建NDArray12345678910111213141516171819202122232425262728from mxnet import nd# 创建行向量x = nd.arange(12)print(x)# 打印实例形状print(x.shape)# 输出 (12,)# 改变实例形状x = x.reshape((3,4))# x = x.reshape((-1,4))print(x)# 创建各项为0 形状为(2,3,4)的张量print(nd.zeros((2,3,4)))# 创建各项为1 形状为(2,3,4)的张量print(nd.ones((2,3,4)))# 创建指定元素的张量y = nd.array([[1,2,3,4], [2,3,5,6], [2,5,7,8]])print(y)# 随机生成 形状为(3,4) 每个元素均服从N(0,1)的正态分布z = nd.random.normal(0, 1, shape=(3,4))print(z)
运算12345678910111213141516171819202122232425262728293031323334 ...
一致性Hash算法
场景如果有N个缓存服务器,将一个对象缓存到某个服务器上,也许可以这样计算对象的hash值,然后映射到某个cache上:
hash(object) % N
这样做存在这两个问题:
如果其中一台服务器发生故障或者被移除,则映射到该服务器上的所有对象都会失效,而且映射公式就变为:hash(object) % (N-1)
相反,如果缓存已经不满足需求,需要增加缓存服务器时,映射公式变为:hash(object) % (N+1)
这就意味着几乎所有的cache都会失效,也有两种解决方案:
清空所有缓存服务器,重新建立缓存。本来缓存就是为了减小数据库压力而设计的,这样做对后端来说,如同一场灾难,严重的可能会到时数据库崩溃。所以,一般应该不会这样做。
夜深人静,流量最小的时候,使缓存服务器中的数据重新分布。
这两种做法的成本都非常大。
一致性hash算法基本原理简单来说,一致性hash算法主要做的就是在添加或者移除一个缓存服务器的时候,能够尽可能小的改变已存在的映射关系。一致性hash算法用的也是取模的方法,只不过是对2^32取模:
先构造一个0~2^32-1的整数环,也称一致性has ...





