打开任何一本深度学习教材,翻开任何一篇讲解神经网络的博客,你都会看到神经元的基本公式:

$$y = \sigma(Wx + b)$$

其中 $W$ 是权重矩阵,$x$ 是输入,$\sigma$ 是激活函数,而 $b$ 就是那个不起眼的偏置(bias)。它看起来只是一个简单的加法,一个向量加法操作,却困扰了无数初学者:为什么需要它?它到底在做什么?为什么有些现代大模型(如LLaMA)会把它删掉?

要理解偏置的本质,需要从神经网络的"婴儿时期"说起,然后一路追踪到今天的大语言模型架构。在这个过程中,你会发现这个看似简单的参数背后,隐藏着深刻的数学原理和工程权衡。

从一条过原点的直线说起

1957年,Frank Rosenblatt发明了感知机(Perceptron),这是神经网络的雏形。感知机的数学形式是:

$$f(x) = \text{sign}(w^T x + b)$$

其中 $\text{sign}$ 是符号函数,输出 $+1$ 或 $-1$。这个公式的几何意义非常清晰:$w^T x + b = 0$ 定义了一个超平面,将输入空间分成两半。

问题来了:如果没有偏置 $b$,这个超平面会变成什么样?

答案是:它必须通过原点。

graph TD
    subgraph 无偏置
    A1["决策边界: w₁x₁ + w₂x₂ = 0"] --> B1["必须经过原点"]
    B1 --> C1["模型灵活性受限"]
    end
    
    subgraph 有偏置
    A2["决策边界: w₁x₁ + w₂x₂ + b = 0"] --> B2["可以任意平移"]
    B2 --> C2["模型表达能力强"]
    end
    
    C1 --> D["分类能力对比"]
    C2 --> D

想象一个最简单的二分类问题:正样本集中在点 $(2, 2)$ 附近,负样本集中在点 $(-2, -2)$ 附近。如果没有偏置,决策边界必须是 $w_1 x_1 + w_2 x_2 = 0$,也就是一条过原点的直线。无论权重如何调整,这条直线都无法很好地分开这两类数据。

加上偏置后,决策边界变成 $w_1 x_1 + w_2 x_2 + b = 0$。偏置 $b$ 就像一个"推手",把整条直线沿法向量方向推离原点,让模型能够找到最优的分类边界。

这正是偏置的核心功能:让模型的决策边界不再受限于原点,获得平移的自由度

数学视角:为什么偏置代表"平移"

从线性代数的角度来看,$y = Wx$ 表示从输入空间到输出空间的线性变换,这个变换包含缩放、旋转、投影等操作,但绝不包含平移。因为平移不是线性操作——$T(0) = 0$ 是线性变换的基本性质,这意味着任何线性变换都必须把原点映射到原点。

graph LR
    subgraph 线性变换 y=Wx
    L1["缩放 Scaling"] --> L4["必须固定原点"]
    L2["旋转 Rotation"] --> L4
    L3["投影 Projection"] --> L4
    end
    
    subgraph 仿射变换 y=Wx+b
    A1["所有线性操作"] --> A3["可以任意平移"]
    A2["加上偏置 b"] --> A3
    end
    
    L4 --> B["表达能力受限"]
    A3 --> C["表达能力完整"]

加上偏置后,$y = Wx + b$ 变成了仿射变换(Affine Transformation),它在线性变换的基础上增加了平移的能力。这个平移能力对于拟合真实数据至关重要,因为真实世界的数据分布很少恰好以原点为中心。

用更直观的语言描述:没有偏置的神经元就像一个被钉在原点的弹簧,只能伸长或旋转,不能移动;有了偏置,弹簧就可以自由移动到任何位置

这个道理不仅适用于感知机,同样适用于深度神经网络。虽然深度网络理论上可以通过多层非线性变换拟合任意函数,但如果没有偏置,每一层的输出都会被"钉"在某些特定位置,极大限制了模型的表达能力。

激活函数:偏置如何影响非线性

偏置的另一个重要作用是控制神经元在激活函数上的"工作区间"。

以Sigmoid激活函数为例:

$$\sigma(x) = \frac{1}{1 + e^{-x}}$$

Sigmoid函数的特性是:输入接近0时,函数近似线性;输入远离0时,函数进入饱和区,梯度接近0。

graph TD
    subgraph 无偏置的问题
    N1["输入加权和 z = wTx"] --> N2{z的范围}
    N2 -->|z远大于0| N3["Sigmoid饱和 → 输出≈1"]
    N2 -->|z远小于0| N4["Sigmoid饱和 → 输出≈0"]
    N3 --> N5["梯度≈0,学习停滞"]
    N4 --> N5
    end
    
    subgraph 有偏置的解决方案
    Y1["输入加权和 z = wTx + b"] --> Y2["调整b控制z的范围"]
    Y2 --> Y3["z在Sigmoid线性区"]
    Y3 --> Y4["梯度正常,学习有效"]
    end

假设某个神经元的输入加权和是 $z = w^T x$(没有偏置),当数据分布导致 $z$ 总是很大的正数或负数时,Sigmoid函数就会进入饱和区。这意味着:

  1. 神经元的输出接近0或1,几乎是常数
  2. 反向传播时梯度接近0
  3. 该神经元几乎不学习,变成"死神经元"

加上偏置 $b$ 后,可以通过调整 $b$ 把 $z = w^T x + b$ 控制在Sigmoid的线性区附近,保证神经元保持"活跃",能够正常学习。

ReLU与死神经元问题

这个现象在ReLU激活函数中更加明显。ReLU的定义是:

$$\text{ReLU}(x) = \max(0, x)$$
graph TD
    subgraph ReLU死神经元形成过程
    R1["神经元输入 z < 0"] --> R2["ReLU输出 = 0"]
    R2 --> R3["梯度 = 0"]
    R3 --> R4["权重不更新"]
    R4 --> R5["神经元永久死亡"]
    end
    
    subgraph 偏置的预防作用
    B1["加入偏置 b"] --> B2["z = wTx + b"]
    B2 --> B3["学习适当的b"]
    B3 --> B4["z分布在正区域"]
    B4 --> B5["神经元保持活跃"]
    end
    
    R5 --> C["对比结果"]
    B5 --> C

如果某个神经元的输入总是负数,ReLU就会输出0,梯度也是0。这个神经元就"死"了——它不再参与学习,也不会对输出产生任何影响。

偏置可以有效地把神经元的输入分布"向右推",避免过多的负输入导致神经元死亡。当然,偏置本身也是需要学习的参数,如果训练不当,也可能导致神经元死亡。但这正是偏置的价值所在——它提供了一个可学习的平移参数,让模型能够自动调整每个神经元的工作区间。

Batch Normalization:偏置的"隐形杀手"

2015年,Sergey Ioffe和Christian Szegedy提出了Batch Normalization(BN),这个技术深刻改变了深度神经网络的训练方式,也改变了偏置的地位。

Batch Normalization的核心操作是:

$$\hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}$$$$y = \gamma \hat{x} + \beta$$

其中 $\mu_B$ 和 $\sigma_B^2$ 是当前batch的均值和方差,$\gamma$ 和 $\beta$ 是可学习的缩放和平移参数。

graph LR
    subgraph BN前有偏置
    A1["线性层: z = Wx + b"] --> B1["BatchNorm"]
    B1 --> C1["减去均值 μB"]
    C1 --> D1["偏置b被完全抵消"]
    D1 --> E1["b参数无效"]
    end
    
    subgraph BN前无偏置
    A2["线性层: z = Wx"] --> B2["BatchNorm"]
    B2 --> C2["减去均值 μB"]
    C2 --> D2["BN的β提供平移"]
    D2 --> E2["参数更高效"]
    end

注意到公式中已经有一个平移参数 $\beta$。如果BN前面是一个线性层(包括全连接层或卷积层),那么:

$$y = \text{BN}(Wx + b) = \gamma \cdot \frac{Wx + b - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} + \beta$$

关键点在于:BN会计算当前batch的均值 $\mu_B$,而这个均值会吸收掉偏置 $b$ 的效果。无论 $b$ 是多少,BN都会先减去均值,相当于把数据"拉回"到均值为中心的位置。

数学上可以证明:

$$\frac{Wx + b - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} = \frac{Wx - \mu_B'}{\sqrt{\sigma_B^2 + \epsilon}}$$

其中 $\mu_B' = \mu_B - b$ 是不含偏置的均值。也就是说,偏置 $b$ 对最终输出的影响会被BN的减均值操作完全抵消,而BN自带的 $\beta$ 参数承担了平移的功能。

这就是为什么在现代深度学习中,BN前面的层通常设置 bias=False——它确实是没有用的,只会浪费计算和存储。

Layer Normalization:Transformer中的偏置

Transformer架构使用的是Layer Normalization(LayerNorm)而不是Batch Normalization。LayerNorm的计算公式是:

$$\hat{x} = \frac{x - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}}$$$$y = \gamma \hat{x} + \beta$$

其中 $\mu_L$ 和 $\sigma_L^2$ 是在特征维度上计算的均值和方差(而不是batch维度)。

graph TD
    subgraph BatchNorm
    BN1["沿Batch维度计算统计量"] --> BN2["依赖batch大小"]
    BN2 --> BN3["推理时需要running stats"]
    BN3 --> BN4["前置偏置冗余"]
    end
    
    subgraph LayerNorm
    LN1["沿特征维度计算统计量"] --> LN2["与batch无关"]
    LN2 --> LN3["推理行为一致"]
    LN3 --> LN4["偏置与β独立"]
    end
    
    BN4 --> C["应用场景不同"]
    LN4 --> C

与BN类似,LayerNorm也有可学习的 $\gamma$(scale)和 $\beta$(shift/bias)参数。这些参数提供了一种"外部"的平移和缩放能力。

但LayerNorm与BN有一个重要区别:LayerNorm通常不紧跟在线性层后面,而是应用在残差连接之后。这意味着LayerNorm的 $\beta$ 参数和线性层的偏置 $b$ 是独立的,不会相互抵消。

然而,在实践中,现代LLM架构(如LLaMA)发现,由于残差连接和LayerNorm的存在,线性层中的偏置参数变得相对不那么重要。Sebastian Raschka的分析指出:

在大型Transformer堆栈中,偏置往往比主权重矩阵贡献更少,同时仍然增加参数、内存流量和实现复杂性。

现代LLM的架构简化:去除偏置

2023年,Meta发布了LLaMA系列模型,其架构相比原始Transformer做了多项简化,其中之一就是移除了大多数线性层的偏置。

graph TD
    subgraph 原始Transformer
    T1["Q/K/V投影: bias=True"]
    T2["输出投影: bias=True"]
    T3["FFN层: bias=True"]
    T1 --> T4["参数量较多"]
    T2 --> T4
    T3 --> T4
    end
    
    subgraph LLaMA架构
    L1["Q/K/V投影: bias=False"]
    L2["输出投影: bias=False"]
    L3["FFN层: bias=False"]
    L1 --> L4["参数量精简"]
    L2 --> L4
    L3 --> L4
    end
    
    T4 --> C["性能相当"]
    L4 --> C

根据LLaMA的官方代码和HuggingFace实现:

  • 注意力层的Q、K、V投影:bias=False
  • 注意力层的输出投影:bias=False
  • FFN层的两个线性变换:bias=False

PaLM(Google的大型语言模型)也采用了类似的设计。这些架构简化的背后,有几个技术考量:

1. 归一化层的补偿作用

LLaMA使用RMSNorm(Root Mean Square Layer Normalization)代替LayerNorm。RMSNorm的计算公式是:

$$y = \frac{x}{\sqrt{\frac{1}{n}\sum_{i=1}^n x_i^2 + \epsilon}} \cdot \gamma$$

与LayerNorm不同,RMSNorm默认不包含偏置参数 $\beta$(只保留缩放参数 $\gamma$)。它不对输入进行中心化(减去均值),只进行缩放归一化。这意味着RMSNorm本身不提供平移能力。

但为什么去除偏置仍然可行?答案在于残差连接。Transformer中的残差连接形式是:

$$\text{output} = x + \text{SubLayer}(x)$$

残差连接提供了恒等映射,让信号可以"直达"后续层。即使子层的输出有一定的偏移,残差连接也会保持一部分原始信号。这种结构本身就提供了一定的"信号传递"能力,降低了对偏置的依赖。

2. 参数效率与计算效率

graph LR
    subgraph 偏置参数计算
    P1["隐藏维度 d=4096"] --> P2["单层偏置: 4096参数"]
    P2 --> P3["32层 × 7个线性层"]
    P3 --> P4["总计约90万参数"]
    end
    
    subgraph 移除后的收益
    R1["参数量减少"] --> R4["总体优化"]
    R2["内存占用降低"] --> R4
    R3["计算量减少"] --> R4
    end
    
    P4 --> C["虽小但累积有意义"]
    C --> R4

对于一个隐藏维度 $d=4096$ 的LLaMA-7B模型,每个偏置向量包含4096个参数。如果有数百个线性层(注意力投影 + FFN层 × 层数),偏置参数的总量也是可观的。去除这些偏置:

  • 减少模型参数量
  • 减少内存占用
  • 减少前向传播的计算(少一次向量加法)
  • 简化实现逻辑

虽然单个偏置向量很小,但在大规模模型中累积起来也是有意义的。

3. 训练稳定性

LLaMA论文提到,去除偏置有助于训练稳定性。虽然没有详细的理论解释,但一个可能的解释是:偏置参数增加了模型的不确定性——它们是额外的可学习参数,如果初始化或更新不当,可能引入不稳定因素。在已经足够复杂的Transformer训练过程中,减少不必要的参数有助于简化优化问题。

注意力机制中的偏置:一个数学证明

在注意力机制中,Query、Key、Value三个线性变换各有自己的偏置:$b_q$、$b_k$、$b_v$。Amazon的研究团队在2023年发表的一篇论文中,用严格的数学证明了其中一个惊人的结论:

Key的偏置 $b_k$ 是完全冗余的,可以移除而不影响注意力输出

graph TD
    subgraph 注意力计算流程
    A["输入 x"] --> B["Q = Wq·x + bq"]
    A --> C["K = Wk·x + bk"]
    A --> D["V = Wv·x + bv"]
    
    B --> E["注意力分数"]
    C --> E
    E --> F["softmax(QKT / √d)"]
    F --> G["加权求和"]
    D --> G
    G --> H["输出"]
    end
    
    subgraph Key偏置冗余证明
    K1["K的每行都加上相同的bk"] --> K2["QKT的每项都加上相同值"]
    K2 --> K3["softmax对整体平移不变"]
    K3 --> K4["bk对输出无影响"]
    end
    
    C --> K1
    K4 --> F

证明的核心在于注意力分数的计算:

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$

展开Q和K的线性变换:

$$Q = W_q x + b_q$$

$$K = W_k x + b_k$$

注意力分数的计算涉及:

$$QK^T = (W_q x + b_q)(W_k x + b_k)^T$$

关键观察:$b_k$ 会被广播到矩阵的每一行,这意味着它对每个位置添加相同的值。而softmax函数有一个重要性质——它对"整体平移"是不变的:

$$\text{softmax}(z + c \cdot \mathbf{1}) = \text{softmax}(z)$$

其中 $c$ 是常数,$\mathbf{1}$ 是全1向量。

因此,$b_k$ 对注意力分数的影响会被softmax的不变性"吃掉",最终不影响输出。

不同偏置的重要性对比

graph LR
    subgraph 偏置重要性排序
    V["bv: 最重要"] --> VD["直接加到输出"]
    VD --> Rank1["★★★★★"]
    
    Q["bq: 中等重要"] --> QD["影响注意力分布"]
    QD --> Rank2["★★★☆☆"]
    
    K["bk: 完全冗余"] --> KD["被softmax抵消"]
    KD --> Rank3["☆☆☆☆☆"]
    end

这篇论文还通过实验验证了这一点:将预训练模型的 $b_k$ 替换为任意随机值,模型输出几乎不变;而修改 $b_q$ 或 $b_v$ 则会导致显著的输出变化。

更有趣的是,论文指出 $b_v$ 的作用比 $b_q$ 更重要:

$$\text{output} = W_v \cdot x \cdot \text{softmax}(...) + b_v$$

$b_v$ 直接加在注意力输出的最后,是最终输出的直接组成部分。而 $b_q$ 只影响注意力分数的计算,间接影响输出。

这项发现对BitFit等参数高效微调方法有直接意义:在BitFit中,只微调偏置参数。论文建议可以冻结 $b_k$,减少约11%的可训练参数,同时不影响性能。

偏置的初始化:为什么零初始化是可以的

神经网络的权重通常需要随机初始化,以打破对称性。但偏置呢?

标准做法是将偏置初始化为零向量。这个选择是合理的,原因如下:

graph TD
    subgraph 权重初始化
    W1["必须随机初始化"] --> W2["打破对称性"]
    W2 --> W3["否则所有神经元相同"]
    end
    
    subgraph 偏置初始化
    B1["可以零初始化"] --> B2["对称性已被权重打破"]
    B2 --> B3["零值是合理起点"]
    B3 --> B4["学习速度快"]
    end
    
    W3 --> C["原因不同"]
    B4 --> C

1. 对称性已被权重打破

如果权重和偏置都初始化为零,那么同一层的所有神经元将有相同的输出,在反向传播时也会有相同的梯度更新。这导致所有神经元永远保持相同——模型学不到有用的东西。

但只要权重是随机初始化的,不同神经元就已经有不同的初始状态。偏置初始化为零不会引入对称性问题。

2. 零偏置是合理的起点

对于经过适当初始化的权重,假设输入数据也经过了标准化处理,那么 $Wx$ 的期望值接近零。此时偏置为零意味着神经元一开始工作在激活函数的中心区域(如Sigmoid的线性区),这是一个合理的起点。

3. 偏置的学习速度快

由于偏置的梯度通常比权重的梯度更简单(没有输入数据的乘法),偏置可以快速调整到合适的值。初始值的影响会被训练过程很快消除。

当然,也有一些特殊情况:

  • ReLU网络中,有时将偏置初始化为小的正值(如0.01),以避免初始时神经元"死亡"
  • 输出层有时会根据类别分布设置初始偏置(如类别不平衡时)

偏置的正则化:为什么通常不惩罚偏置

在L2正则化(权重衰减)中,我们在损失函数中添加 $\frac{\lambda}{2}\|W\|^2$ 项,惩罚过大的权重。但标准做法是不对偏置进行正则化。

graph TD
    subgraph 权重正则化
    WR1["权重W控制映射形状"] --> WR2["大权重=高敏感度"]
    WR2 --> WR3["可能导致过拟合"]
    WR3 --> WR4["需要正则化惩罚"]
    end
    
    subgraph 偏置不正则化
    BR1["偏置b控制输出位置"] --> BR2["不增加复杂度"]
    BR2 --> BR3["不影响泛化能力"]
    BR3 --> BR4["无需正则化"]
    end
    
    WR4 --> C["职责不同"]
    BR4 --> C

原因有几点:

1. 偏置控制的是"位置",不是"复杂度"

权重 $W$ 控制的是输入到输出的映射"形状",大的权重意味着模型对输入变化非常敏感,可能导致过拟合。偏置 $b$ 控制的是输出分布的"位置"或"中心点",它本身并不增加模型对训练数据的"记忆"能力。

2. 正则化偏置可能伤害学习

如果惩罚偏置,模型会倾向于把偏置推向零。对于某些任务,最优的偏置可能确实是非零的。强行约束偏置可能导致欠拟合。

3. 参数量占比小

偏置参数的数量通常只占总参数量的很小一部分。对于一个大矩阵乘法,偏置向量的大小只是输出维度。正则化偏置对整体模型复杂度的影响微乎其微。

实践中,大多数深度学习框架默认不对偏置进行权重衰减。PyTorch的优化器在设置weight_decay时,只会惩罚名为weight的参数,自动跳过bias

实践建议:何时保留偏置,何时移除

根据前面的分析,可以总结出以下实践指南:

graph TD
    Start["判断是否需要偏置"] --> Q1{"层后是否有BatchNorm?"}
    
    Q1 -->|是| NoBias1["bias=False"]
    Q1 -->|否| Q2{"是否为注意力Key投影?"}
    
    Q2 -->|是| NoBias2["bias=False(数学证明冗余)"]
    Q2 -->|否| Q3{"是否为现代LLM架构?"}
    
    Q3 -->|是| NoBias3["bias=False(可选优化)"]
    Q3 -->|否| Q4{"是否为输出层?"}
    
    Q4 -->|是| WithBias1["bias=True(通常需要)"]
    Q4 -->|否| Q5{"网络是否有归一化层?"}
    
    Q5 -->|无| WithBias2["bias=True(推荐保留)"]
    Q5 -->|有| Default["默认True,但可选优化"]

保留偏置的情况

  1. 线性层后直接接激活函数:没有归一化层介入,偏置是控制激活函数工作区间的关键参数。

  2. 输出层:分类或回归任务的最后一层通常需要偏置,以调整输出的整体分布。

  3. 没有归一化层的网络:如简单的MLP、早期的CNN架构(AlexNet、VGG),偏置不可或缺。

  4. RNN/LSTM:循环网络中的门控机制依赖偏置来控制门的开合程度。

可以移除偏置的情况

  1. BatchNorm前面的层:BN的减均值操作会完全抵消前置偏置的效果。

  2. 现代LLM架构:如LLaMA、PaLM等,由于残差连接和归一化层的存在,线性层偏置的重要性降低。

  3. 注意力机制的Key投影:数学上证明是冗余的。

  4. 追求极致效率的场景:在参数量或计算量极其敏感的应用中,移除非必要偏置可以带来微小但累积的收益。

PyTorch中的实现

# 标准线性层(有偏置)
linear_with_bias = nn.Linear(in_features, hidden_dim, bias=True)

# BN前面的层(无偏置)
linear_no_bias = nn.Linear(in_features, hidden_dim, bias=False)
bn = nn.BatchNorm1d(hidden_dim)

# 现代Transformer风格
self.q_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
self.k_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
self.v_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
self.out_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)

总结

偏置项,这个神经网络中最不起眼的组件,承载着"平移自由度"的核心功能。它让模型的决策边界不必受限于原点,让神经元可以在激活函数的舒适区工作,让深度网络具备完整的仿射变换能力。

同时,现代深度学习架构的发展也在不断重新审视偏置的必要性。Batch Normalization的出现让前置偏置变得冗余;LayerNorm和残差连接的组合让现代LLM可以安全地移除大多数线性层的偏置;严格的数学证明揭示了注意力机制中Key偏置的完全无用性。

这并不意味着偏置不重要。恰恰相反,理解偏置的本质——它为什么被需要,在什么情况下变得不重要——是深入理解神经网络工作机制的必经之路。

当你下次写 nn.Linear(in_features, out_features, bias=True)bias=False 时,希望你能清晰地知道:这个参数在做什么,为什么需要它,或者为什么可以不要它。


参考文献

  1. Rosenblatt, F. (1958). The perceptron: a probabilistic model for information storage and organization in the brain. Psychological Review.

  2. Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift. ICML.

  3. Ba, J. L., Kiros, J. R., & Hinton, G. E. (2016). Layer normalization. arXiv preprint arXiv:1607.06450.

  4. Zhang, B., & Sennrich, R. (2019). Root mean square layer normalization. NeurIPS.

  5. Touvron, H., et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv preprint arXiv:2302.13971.

  6. Chowdhery, A., et al. (2022). PaLM: Scaling language modeling with pathways. arXiv preprint arXiv:2204.02311.

  7. Namazifar, M., Hazarika, D., & Hakkani-Tür, D. (2023). Role of Bias Terms in Dot-Product Attention. IEEE Signal Processing Letters.

  8. Vaswani, A., et al. (2017). Attention is all you need. NeurIPS.

  9. Raschka, S. (2024). Why do some LLMs remove bias terms from linear layers? Ahead of AI.

  10. He, K., et al. (2016). Deep residual learning for image recognition. CVPR.

  11. Glorot, X., & Bengio, Y. (2010). Understanding the difficulty of training deep feedforward neural networks. AISTATS.

  12. Ma, N., et al. (2018). The highway network as an approximation to the backtracking search strategy. arXiv preprint arXiv:1802.06938.