Sitzmann V., Martel J. N. P., Bergman A. W., Lindell D. B., Wetzstein G. Implicit neural representations with periodic activation functions. Advances in Neural Information Processing Systems (NIPS), 2020.

本文提出用\(\sin\)作为激活函数, 并分析该类型的网络应该如何初始化.

主要内容

本文研究如下的网络结构:

\[\Phi(x) = W_n (\phi_{n-1} \circ \phi_{n-2}\circ \cdots \circ \phi_0)(x), x_i \rightarrow \phi_i(x_i) = \sin (W_i x_i + b_i).
\]

即一个用sin作为激活函数的MLP.

为了说明使用sin作为激活函数的好处, 作者首先利用一个简单的例子作为说明, 设想如下的任务:

  1. \(\Phi\) 以位置坐标\((i, j)\)为输入, 输出\(\Phi(i, j) \in \mathbb{R}^3\)表示该像素点图片的r, g, b;
  2. \(\Phi\)以一个图片作为训练集, 假设该图片为\(f(i, j) \in \mathbb{R}^3, i = 1,2,\cdots, j = 1,2,\cdots, W\), 则训练集为\(\{(i, j, f(i, j))\}\), 共\(HW\)个坐标点及其对应的目标;
  3. 通过平方损失\(\tilde{\mathcal{L}} = \sum_i \sum_j \|\Phi(i, j) - f(i, j)\|^2\)训练网络.

上图给了一个例子(既然是灰度图, 我想这时\(\Phi(i, j) \in \mathbb{R}\)), 展示了用不同激活函数得到的\(\Phi(i, j)\)的图, 显然图和原图越接近, 说明拟合能力越强.

特别的, 作者还展示了\(\nabla f(x)\)和\(\Delta f(x)\) (分别用sobel算子和laplacian算子得到的) 和各自网络关于\((i, j)\)的梯度和二阶梯度的比较. 发现只有SIREN是高度一致的(一个很重要的原因是ReLU等分段连续函数二阶导为0).

初始化策略

作者希望每一层(除了第一层)的输入输出的分布是一致的, 这能够让堆叠网络层数变得容易, 加快收敛.

其策略是:

\[w_i \sim \mathcal{U}(-\sqrt{6 / n}, \sqrt{6 / n}),
\]

其中\(n\)是输入\(x \in \mathbb{R}^n\)的维度.

但是, 因为\(\sin (wx+b)\)中的\(w\)可以看成是采样频率, 为了保证第一层的采样频率足够高(采样定理), 作者乘上了一个额外的系数:

\[\sin (w_0 \cdot W x + b),
\]

文中说\(w_0=30\)是一个不错的选择.

同时作者还发现, 该技巧应用于别的层一样有效, 所以干脆所有层都长上面那个样, 同时

\[w_i \sim \mathcal{U}(-\sqrt{6 / w_0^2n}, \sqrt{6 / w_0^2n}).
\]

作者认为这么做有效是因为关于\(W\)的梯度也乘上了一个因子\(w_0\), 但同时分布不变.

其它的好处

SIREN对于包含梯度问题的处理尤为出色, 这或许应该归功于其导数依然是一个SIREN网络, 而如ReLU的一阶导为常数, 二阶导为0自然无法胜任.

类似的结构, 但是这一次, 假设只知道图片的\(\nabla f(i, j)\)或者\(\Delta f(i, j)\),由此通过

\[\|\nabla \Phi(i, j) - \nabla f(i, j)\|^2,
\]

或者

\[\|\Delta \Phi(i, j) - \Delta f(i, j)\|^2,
\]

来拟合, 则\(\Phi(i, j)\)依然输出和\(f(i, j)\)相近的结果(如上图左所示).

上图右则是逼近\(\alpha \nabla f_1 (i, j) + ( 1- \alpha) f_2 (i, j)\)

对两张图片进行混合, 得到的\(\Phi(i, j)\)恰为两张图片的融合.

SIREN的强大之处可见一斑.

Implicit Neural Representations with Periodic Activation Functions的更多相关文章

  1. [CS231n-CNN] Training Neural Networks Part 1 : activation functions, weight initialization, gradient flow, batch normalization | babysitting the learning process, hyperparameter optimization

    课程主页:http://cs231n.stanford.edu/   Introduction to neural networks -Training Neural Network ________ ...

  2. Activation Functions

    Sigmoid Sigmoids saturate and kill gradients. Sigmoid outputs are not zero-centered. Exponential fun ...

  3. Activation Functions and Their Derivatives

    1. Sigmoid Function: when z=0,g'(z)=0.25 2. tanh Function: when x=0,tanh'(x)=1 3. Relu

  4. Activation functions on the Keras

    sigmoid tanh tanh函数定义如下: 激活函数形状: ReLU 大家族 ReLU softmax 函数 softmax是一个函数,其主要用于输出节点的分类,它有一个特点,所以的值相加会等于 ...

  5. 《MATLAB Deep Learning:With Machine Learning,Neural Networks and Artificial Intelligence》选记

    一.Training of a Single-Layer Neural Network 1 Delta Rule Consider a single-layer neural network, as ...

  6. Glossary Collection

    目录 直接修饰用 间接强调用 (多为副词) 过渡用 特别的名词 动词 词组 各种介词 句子 摘要 引言 总结 正文 实验 直接修饰用 Word 含义 例句 近义词 nuanced adj. 微妙的:具 ...

  7. 深度学习材料:从感知机到深度网络A Deep Learning Tutorial: From Perceptrons to Deep Networks

    In recent years, there’s been a resurgence in the field of Artificial Intelligence. It’s spread beyo ...

  8. TensorFlow 常用函数汇总

    本文介绍了tensorflow的常用函数,源自网上整理. TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU ...

  9. TensorFlow 常用函数与方法

    摘要:本文主要对tf的一些常用概念与方法进行描述. tf函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CP ...

随机推荐

  1. C/C++ Qt 数据库与ComBox多级联动

    Qt中的SQL数据库组件可以与ComBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,我们让其在另一个ComBox组件中列举出该用户所维护的主机列表,又或者当 ...

  2. admire, admit

    admire 当别人admire你时,小心掉进泥潭(mire).词源:to wonder. wonderful夸人,awful骂人,awesome夸人.admiral与admire词源不同,碰巧长得像 ...

  3. 从面试官的角度,聊聊java面试流程

    在这篇回答里,就讲以我常规的面试流程为例,说下java方面大致会问什么问题,以及如何确认候选人达到招聘要求. 先说面试前准备,可能有些面试官是拿到简历直接问,而且是在候选人自我介绍时再草草浏览简历,但 ...

  4. fastjson过滤多余字段

    /**     * Description:过滤实体中的字段     * @param src 需要过滤的对象,如 list,entity     * @param clazz 实体的class    ...

  5. jquery对radio和checkbox的操作

    jQuery获取Radio选择的Value值 代码  $("input[name='radio_name'][checked]").val(); //选择被选中Radio的Valu ...

  6. java通过jdbc连接数据库并更新数据(包括java.util.Date类型数据的更新)

    一.步骤 1.获取Date实例,并通过getTime()方法获得毫秒数: 2.将获取的毫秒数存储到数据库中,注意存储类型为nvarchar(20): 3.读取数据库的毫秒数,作为Date构造方法的参数 ...

  7. logrotate没有rotate的排查过程

    前言 背景 xxx,你过来把squid的日志检查一下,是否做了日志切割:于是乎开启了logrotate没有切割日志的排查旅程,em--.只能说过程很爽,平时疲于应付繁琐的事情,难得有点时间能一条线慢慢 ...

  8. ts配置项

    { "compilerOptions": { /* 基本选项 */ "target": "es5", // 指定 ECMAScript 目标 ...

  9. cron 获取下次运行时间(基于 C# + Quartz.NET)

    代码 Quartz 的 cron 支持秒,导致一些 cron 库无法准确的获得下次执行时间,这里使用 Quartz.Net 自带的方法来获取下次执行时间. //引用 Quartz CronExpres ...

  10. mapbox获取各种经纬度

    点击地图即可获取经纬度,也可以手动输入经纬度来换算 在线查看运行效果 实现方法 mapbox中通过地图点击事件来获取到坐标,然后转换为其他的坐标系并输出在屏幕上即可 获取坐标 方法很简单,给地图添加一 ...