You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R的neuralnet包中为神经网络添加自定义偏置/偏移量

解决方案

先拆解你的Keras模型核心逻辑:

  • 特征输入经两层全连接(tanh激活→指数激活)得到预测值A
  • Volume输入经固定权重为1的线性层直接输出自身(记为B)
  • 最终输出为A*B,用MSE损失、RMSProp优化器训练

下面是转到neuralnet的具体步骤:

1. 合并输入数据

neuralnet仅支持单数据框输入,需把特征矩阵、volume数据、响应变量合并成一个数据框:

# 假设feature_matrix是矩阵,先转成数据框
feat_df <- as.data.frame(feature_matrix)
# 合并所有数据,volume列来自offset_matrix,响应变量列来自response_matrix
train_data <- cbind(feat_df, 
                    volume = offset_matrix[, 1], 
                    response = response_matrix[, 1])

2. 处理固定权重的偏移层

你的Keras偏移层本质是直接输出volume本身(权重1、无偏置、不可训练),在neuralnet里无需单独定义该层——训练时先预测A,再手动乘以volume得到最终输出即可,这和原模型逻辑完全一致。

3. 自定义激活函数

原模型输出层用k_exp(指数函数),neuralnet默认没有该激活函数,需手动定义:

# 对应Keras的k_exp
k_exp <- function(x) exp(x)

4. 构建并训练神经网络

根据原模型结构,分两种场景处理:

场景1:Volume值不为0(可安全除法)

可将目标变量转换为response / volume,让模型直接预测这个值(即原模型的A),训练后再乘以volume得到最终结果,这种方式最贴合neuralnet的公式驱动逻辑:

# 构造新目标变量
train_data$target <- train_data$response / train_data$volume

# 生成公式:所有特征作为输入,预测target
feat_cols <- colnames(feat_df)
nn_formula <- as.formula(paste("target ~", paste(feat_cols, collapse = " + ")))

# 训练模型
nn_model <- neuralnet(
  formula = nn_formula,
  data = train_data,
  hidden = q,  # 对应Keras第一层全连接的单元数q
  act.fct = "tanh",  # 隐藏层用tanh激活
  linear.output = FALSE,  # 输出层用自定义激活函数,关闭线性输出
  err.fct = "sse",  # 平方和误差,与MSE仅差样本数倍数,不影响优化方向
  algorithm = "rms",  # 选择RMSProp优化器,对应Keras的rmsprop
  act.fct.output = k_exp  # 输出层用自定义的指数激活
)

若你的neuralnet版本不支持单独设置输出层激活函数,可先训练线性输出模型,再手动对预测结果应用k_exp:

# 训练线性输出模型
nn_model <- neuralnet(
  formula = nn_formula,
  data = train_data,
  hidden = q,
  act.fct = "tanh",
  linear.output = TRUE,
  err.fct = "sse",
  algorithm = "rms"
)

# 对模型输出应用指数激活得到A
predict_A <- compute(nn_model, train_data[, feat_cols])$net.result
predict_A <- k_exp(predict_A)

场景2:Volume可能为0

此时不能做除法,需先训练模型预测A,再手动与volume相乘得到最终输出:

# 公式:所有特征预测一个中间变量(即A)
nn_formula <- as.formula(paste("response ~", paste(feat_cols, collapse = " + ")))

# 训练模型(输出层先线性,之后手动加指数激活)
nn_model <- neuralnet(
  formula = nn_formula,
  data = train_data,
  hidden = q,
  act.fct = "tanh",
  linear.output = TRUE,
  err.fct = "sse",
  algorithm = "rms"
)

# 得到A:模型输出应用指数激活
predict_A <- compute(nn_model, train_data[, feat_cols])$net.result
predict_A <- k_exp(predict_A)

# 最终预测值 = A * volume
final_predict <- predict_A * train_data$volume

5. 查看网络架构

这正是你改用neuralnet的核心需求,直接运行以下代码即可可视化网络结构:

plot(nn_model)

6. 预测新数据

用compute()函数对新数据做预测,再按原逻辑处理得到最终结果:

# 假设test_data是预处理好的测试数据框
predict_A <- compute(nn_model, test_data[, feat_cols])$net.result
predict_A <- k_exp(predict_A)
final_predict <- predict_A * test_data$volume

内容的提问来源于stack exchange,提问作者JGM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:05:33