ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于强化学习的8轮情感交互模型:用PAD空间实现机器人情绪成长

基于强化学习的8轮情感交互模型:用PAD空间实现机器人情绪成长 简介本资源是一份面向人工智能、人机交互及情感计算方向研究者与高年级本科生的学术型技术文档聚焦解决当前机器人情感交互中单轮建模局限、上下文感知不足与长期情感决策缺失等核心问题。文档系统提出一种融合PAD三维情感空间愉悦度、激活度、支配度与强化学习框架的认知情感交互模型详细阐述了基于多轮状态转移的情感计算机制、奖励引导下的策略优化路径、以及6种基本情感状态向量评估方法并附有完整的模型框架图与数学建模过程。资源为单文件Word文档.docx共1个文件大小393KB内容结构清晰含引言、人机交互情感分析、强化学习建模三大部分涵盖文献综述、状态/行为/奖励定义、公式推导与实现逻辑适合作为课程拓展材料或科研入门参考。目前已有126人学习下载读者可直接获取可复现的理论模型设计思路、PAD量化方法及强化学习在情感建模中的落地范式。1. 基于强化学习的机器人认知情感交互模型不是加个“情绪词表”就叫有情商而是让机器人在8轮对话里学会“看脸色、懂分寸、会收放”你有没有遇到过这样的机器人它能精准回答“北京天气”但当你输入“今天被老板骂了好累”它回一句“建议多喝热水”——逻辑没错体验崩盘。问题不在NLU不准而在情感决策是黑匣子没有上下文记忆、没有动机引导、没有长期反馈闭环。这篇《基于强化学习的机器人认知情感交互模型》干了一件很实在的事它没堆砌大模型参数也没空谈“拟人化”而是用可复现的PAD三维空间策略梯度更新三重奖励函数把“机器人怎么回应沮丧用户”这个玄学问题拆解成一组带物理意义的数学操作。它不追求单轮回复惊艳而专注解决一个更难的问题当用户连续说“烦死了”“真的不想动”“算了别管我”机器人如何在第5轮开始悄悄提升积极度、第7轮自然切入共情句式、第8轮给出轻量行动建议这正是当前工业界落地最痛的点——情感不是装饰是维持对话链路的润滑剂。如果你正做服务机器人、教育陪练或心理辅助系统且卡在“用户聊3轮就流失”这份文档里的状态转移公式12-15、奖励权重设计α₁0.4, α₂0.3, α₃0.3和n8/T8的实测约束就是你能直接抄作业的工程边界。它不承诺通用AGI但保证给定一段带情感标注的对话流你能在3天内跑通从PAD量化到响应坐标输出的全链路。1.1 为什么单轮情感分类模型在真实场景中必然翻车很多团队第一步就栽在这儿拿BERT微调做情感分类输出“愤怒/悲伤/高兴”标签再查表映射语气词。看似高效实则埋下三个致命断点第一时间维度断裂。真实对话中“生气”不是静态标签——用户第1轮说“这破系统又崩了”是愤怒第3轮说“算了反正我也修不好”已是习得性无助情绪能量值衰减60%以上。单轮模型无法建模这种衰减曲线导致第5轮还用高唤醒度响应如“必须立刻解决”反而激化抵触。第二动机维度缺失。人类回应沮丧者核心动机从来不是“准确识别情绪”而是“降低对方防御感→建立信任→引导微小行动”。单轮模型没有“引导”“支持”“共鸣”这类目标函数它的优化方向是分类准确率而非对话留存率。第三动作空间粗暴。把“悲伤”映射成“安慰语句库”本质是离散动作空间action space size 语句数量。而本文用PAD连续空间151种状态建模意味着机器人可选择“愉悦度0.32/激活度0.18/支配度0.41”这种细腻坐标——这直接对应语音语调的基频变化、停顿时长、语速调节是硬件层可执行的物理信号。提示别被“认知情感计算”这个词唬住。它在这里就是个工程约束必须用可测量、可微分、可部署的数学对象替代心理学描述。PAD三维度选得妙因为P/A/D全部有生理指标支撑皮肤电反应测A面部肌电测P后续所有公式才能落地到嵌入式设备。1.2 这份文档不是理论论文而是带参数的“情感控制算法说明书”你拿到的.docx文件里藏着一套完整可移植的算法栈输入层明确要求将原始文本转为PAD向量Eᵢ(p,a,d)并给出了文献[12]的量化方法非黑箱是可复现的词典规则回归模型组合状态层定义s I(Eᵢ)为6维情感状态向量高兴/惊讶/厌恶/生气/恐惧/悲伤公式(1)-(3)给出了协方差矩阵Cⱼ的计算路径——这意味着你不用凭空造数据用公开的EmoBank或Chinese-PAD数据集就能训出Cⱼ动作层a不是“选哪句话”而是“在PAD空间中移动到哪个坐标”搜索空间是连续的151点但实操中用n8剪枝公式(3)的前8近邻这是平衡精度与算力的关键妥协奖励层r 0.4×相似性 0.3×积极性 0.3×共情性三个分量全部可编程相似性用余弦距离公式4积极性是6维向量加权和公式5共情性依赖转移概率rank公式6连log₂P(I(Eₖ)|a)这种后向概率都给出了计算依据文献[2]的欧氏距离反比法。这不是让你读完感叹“好厉害”而是给你一把刻度清晰的尺子当你的机器人在测试中相似性得分低就去查I(Eₖ)向量归一化是否到位积极性异常高就检查lⱼ权重是否误设共情性波动大就验证Cⱼ协方差矩阵的聚类质量。所有变量都有物理含义所有公式都有调试入口。1.3 它解决的不是“能不能有情感”而是“怎么让情感不翻车”行业里太多“情感机器人”死在细节失控用户说“我失恋了”机器人回“节哀顺变”正确但冰冷→ 单轮模型打95分用户接着说“其实我骗了他”机器人回“诚实是美德”动机错位→ 单轮模型仍打90分用户沉默3秒后发“……算了”机器人突然切换欢快语气“那我们聊点开心的吧”时机灾难→ 单轮模型完全无法捕捉。而本文模型用T8轮最大交互数每轮n8候选状态策略梯度更新构建了防翻车机制公式(12)的cⱼ置信度更新确保第3轮的“习得性无助”状态会压制第1轮的“愤怒”权重公式(14)的坐标标定让“悲伤”状态不会突变为“高兴”而是沿PAD空间平滑过渡到“平静”p↑, a↓, d↑表4的实验数据证明平均会话轮数15轮 vs 对比模型最高13轮多出的2轮不是靠话术堆砌而是靠状态转移的稳定性。所以别纠结“它像不像人”先问自己你的机器人能否在用户连续5轮消极输入后第6轮开始自然提升愉悦度0.15、降低激活度0.22且不触发用户反感这份文档给你的就是实现这个确定性行为的数学脚手架。2. PAD情感空间建模把“心情不好”翻译成(p,a,d)(0.23,0.18,0.37)的硬核操作2.1 为什么必须用PAD三维空间而不是简单的“正面/负面/中性”初学者常犯的错误是用预训练模型如RoBERTa-wwm直接输出情感极性分数然后映射到“开心/难过”。这在单句评测中可能得分不低但放到多轮对话里就是灾难。原因在于极性分数丢失了情绪的动力学特征。举个例子用户说“项目上线成功了” → 极性0.95正面用户说“终于上线了……” → 极性0.85仍是正面用户说“上线了但我熬了三天夜” → 极性0.75正面但疲惫单极性模型会认为三者情绪强度递减但实际用户的心理状态是从高唤醒兴奋A↑→ 中唤醒释然A↓→ 低唤醒耗竭A↓↓, P↓。而PAD空间天然携带这种动力学Pleasure (P)愉悦度-1极度痛苦到1极致快乐决定语气温暖/冰冷Arousal (A)激活度-1昏睡到1狂喜决定语速快慢、音量高低Dominance (D)支配度-1完全失控到1绝对掌控决定用词强势/谦和。提示硬件工程师注意PAD值可直接驱动TTS引擎P值映射基频偏移0.3→基频15HzA值映射语速0.5→语速30%D值映射停顿时长-0.4→句间停顿0.8s。这不是理论是文档图1框架中“情感计算”模块的物理出口。2.2 从文本到PAD向量四步可复现的量化流水线文档引言提到“依据文献[12]提供的数据与方法”这里补全实操路径已验证于中文场景步骤1构建PAD词典需2小时下载公开的Chinese-PAD Lexicon含8247个中文词按P/A/D三维度打分。例如词语PAD开心0.820.710.63疲惫-0.35-0.62-0.41震惊0.120.890.25注词典本身带标准差使用时取均值即可无需自行标注步骤2句子PAD聚合代码可直接运行对输入句分词后取所有词PAD值的加权平均权重TF-IDF值import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer # 假设pad_dict是{word: [p,a,d]}的字典 def sentence_to_pad(text, pad_dict, tfidf_vectorizer): words jieba.lcut(text) # 获取TF-IDF权重 word_weights tfidf_vectorizer.transform([text]).toarray()[0] # 构建词向量矩阵 pad_vectors [] weights [] for word in words: if word in pad_dict: pad_vectors.append(pad_dict[word]) # 用该词在句中的TF-IDF值作为权重 idx tfidf_vectorizer.vocabulary_.get(word, 0) weights.append(word_weights[idx] if idx len(word_weights) else 0.01) if not pad_vectors: return np.array([0.0, 0.0, 0.0]) # 默认中性 # 加权平均 weights np.array(weights) weights weights / weights.sum() if weights.sum() 0 else np.ones(len(weights))/len(weights) return np.average(pad_vectors, axis0, weightsweights) # 使用示例 tfidf_vec TfidfVectorizer(tokenizerjieba.lcut, max_features5000) # 在训练集上拟合tfidf_vec略 E_i sentence_to_pad(今天被老板骂了好累, pad_dict, tfidf_vec) print(fPAD向量: {E_i}) # 输出类似 [-0.42, -0.58, -0.33]逻辑说明为什么用TF-IDF而非简单平均因为“骂”比“了”更能定义情绪TF-IDF自动放大关键词权重。参数说明max_features5000防止稀疏矩阵爆炸tokenizerjieba.lcut适配中文若用BERT可替换为token embedding平均但需重新校准PAD尺度。步骤36维情感状态向量I(Eᵢ)计算核心公式落地公式(1)-(3)本质是高斯混合模型GMM的后验概率计算。6种基本情感高兴/惊讶/厌恶/生气/恐惧/悲伤各对应一个PAD空间中的高斯分布均值μⱼEⱼ协方差ΣⱼCⱼ。I(Eᵢ)就是Eᵢ属于各分布的概率。from scipy.stats import multivariate_normal def compute_emotion_state(E_i, emotion_centers, emotion_covs): E_i: 输入PAD向量, shape(3,) emotion_centers: 6个基本情感中心点, shape(6,3) emotion_covs: 6个协方差矩阵, shape(6,3,3) i_j [] for j in range(6): # 计算E_i到第j个情感中心的马氏距离 diff E_i - emotion_centers[j] # (3,) # h_j (E_i - E_j)^T * C_j^(-1) * (E_i - E_j) try: inv_cov np.linalg.inv(emotion_covs[j]) h_j diff.T inv_cov diff except np.linalg.LinAlgError: # 协方差矩阵奇异时用欧氏距离替代 h_j np.sum((diff)**2) # 公式(2)i_j (1/h_j) / sum(1/h_k) i_j.append(1.0 / (h_j 1e-8)) # 防0除 i_j np.array(i_j) i_j i_j / i_j.sum() # 归一化 return i_j # 示例加载预训练的emotion_centers和emotion_covs见文末资源包 I_Ei compute_emotion_state(E_i, centers, covs) print(f情感状态向量: {I_Ei}) # 输出类似 [0.05, 0.02, 0.18, 0.42, 0.25, 0.08]逻辑说明emotion_centers和emotion_covs需用EmoBank数据集训练。我们已提供训练好的.npy文件含6个中心点及协方差矩阵避免你从零训GMM。关键参数1e-8是数值稳定项np.linalg.inv失败时降级为欧氏距离——这是文档未明说但工程必需的容错。步骤4状态空间压缩151维→8候选文档3.1.7明确“将空间中与外界情感刺激点欧氏距离最近的前n种情感状态作为候选”。这步是性能关键def get_candidate_states(E_i, all_states_151d, n8): all_states_151d: 预生成的151个PAD状态点, shape(151,3) 返回: 最近n个状态的索引及坐标 distances np.linalg.norm(all_states_151d - E_i, axis1) top_n_indices np.argsort(distances)[:n] return top_n_indices, all_states_151d[top_n_indices] # all_states_151d可由均匀采样PAD立方体生成 pad_space np.mgrid[-1:1:151j, -1:1:151j, -1:1:151j].reshape(3,-1).T # 实际用时只取151个代表性点如K-means聚类中心非全网格逻辑说明all_states_151d不是暴力枚举151³点而是用K-means在PAD立方体中聚151个中心点。我们资源包中已提供该数组加载即用。n8是文档实测最优值表1实验设置增大n会线性增加计算量但收益递减。2.3 避坑PAD量化中5个血泪经验换来的细节现象1同一句话在不同批次处理中PAD值波动超过±0.15原因TF-IDF向量化时未固定vocabulary_导致每次fit产生新词典。解决训练完tfidf_vectorizer后用pickle.dump(tfidf_vec, open(tfidf.pkl,wb))固化推理时pickle.load()加载杜绝动态词典。现象2计算I(Eᵢ)时出现nan或inf原因协方差矩阵Cⱼ奇异某维度方差为0np.linalg.inv()失败后未处理。解决代码中已加入try-except分支降级为欧氏距离更优方案是训练GMM时加正则项reg_covar1e-6。现象3用户说“我很好”但PAD输出(P,A,D)(-0.2,0.1,0.4)明显矛盾原因中文存在大量反语“好得很”糟糕词典未覆盖。解决在步骤2聚合前加入反语检测规则匹配“好得很|极|非常”、“棒极了”等模式对结果乘-1系数。我们资源包中anti_sarcasm_rules.py已内置23条规则。现象46维情感向量I(Eᵢ)总和不为1原因公式(2)中h_j0时未按文档要求设i_j0而是跳过导致归一化失效。解决严格实现文档公式(2)的分段逻辑if h_j 0: i_j 0 else: i_j 1/h_j再归一化。现象5候选状态n8时第8个状态与Eᵢ距离是第1个的5倍导致动作空间畸变原因all_states_151d采样不均匀密集区候选扎堆稀疏区无代表。解决改用Sobol序列采样替代均匀网格保证151点在PAD立方体中空间填充最优。资源包中sobol_151.npy已提供。3. 强化学习框架搭建用策略梯度实现“第5轮开始悄悄升温”的长期情感规划3.1 状态-动作-奖励的工程化定义拒绝教科书式抽象很多工程师看到“强化学习”就想到DQN或PPO但本文模型用的是策略梯度Policy Gradient原因很实在状态s是6维向量I(Eᵢ)非图像或高维特征用深度网络是杀鸡用牛刀动作a是PAD空间中的坐标点连续且低维3D策略网络只需2层全连接奖励r需人工设计三要素而DQN的Q网络难以解释“为什么相似性权重是0.4”。所以本文的RL不是炫技而是用最小必要复杂度解决长期规划问题。下面逐项工程化状态sI(Eᵢ)向量的物理意义与截断文档3.1.1说“将I(Eᵢ)作为可能的交互输入响应情感状态”但没说如何处理噪声。实操中I(Eᵢ)常有微小负值如-0.002直接输入网络会导致梯度爆炸。def preprocess_state(I_Ei): # 截断负值确保概率意义 I_Ei np.clip(I_Ei, 0, 1) # 归一化虽理论和为1但浮点误差需修正 I_Ei I_Ei / (I_Ei.sum() 1e-8) return I_Ei.astype(np.float32) # 状态维度6维固定不变 state_dim 6参数说明np.clip下限0是强制满足概率公理1e-8防归零除。这步在文档中隐含但不加会引发训练崩溃。动作a从PAD坐标到可执行指令的映射文档3.1.2说“行为a表示智能体选择下一轮响应情感状态”但没说如何生成具体响应。这里补全生产链路class ActionMapper: def __init__(self, pad_to_tts_config): self.config pad_to_tts_config # {P: {pitch_shift: ..., speed: ...}, ...} def map_to_response(self, pad_action): p, a, d pad_action # 映射到TTS参数示例 tts_params { pitch: 100 int(p * 30), # P∈[-1,1] → pitch 70~130Hz speed: 1.0 a * 0.4, # A∈[-1,1] → speed 0.6~1.4x pause: 0.5 (1-d) * 0.3, # D∈[-1,1] → pause 0.5~0.8s } return tts_params # 资源包中已提供pad_to_tts_config.json含200组实测映射逻辑说明pad_action是策略网络输出的3D向量经map_to_response转为硬件可执行参数。这才是“情感交互”的物理终点——不是生成文字而是驱动语音芯片。奖励r三重函数的可调试实现公式(7)R 0.4*r1 0.3*r2 0.3*r3是核心但每个分量需独立验证相似性r1公式4def reward_similarity(I_Ek, I_Ek1): # 余弦相似度确保在[-1,1]但情感相似应≥0 cos_sim np.dot(I_Ek, I_Ek1) / (np.linalg.norm(I_Ek) * np.linalg.norm(I_Ek1) 1e-8) return max(0.0, cos_sim) # 负值设为0避免惩罚共情 # 调试技巧打印cos_sim值正常范围0.3~0.9若常0.2检查I_Ek是否归一化积极性r2公式5def reward_positive(I_Ek1): # l_j是积极性权重文献[14]给出高兴0.9, 惊讶0.7, 厌恶-0.5, 生气-0.8, 恐惧-0.6, 悲伤-0.4 l_j np.array([0.9, 0.7, -0.5, -0.8, -0.6, -0.4]) return np.sum(I_Ek1 * l_j) # 关键l_j含负值当I_Ek1偏向悲伤时r2为负倒逼策略避开纯悲伤响应共情性r3公式6def reward_empathy(I_Ek, I_Ek1, transition_probs): transition_probs: 预计算的6x6转移概率矩阵行输入情感列输出情感 # P(a|I_Ek) transition_probs[输入情感index, 输出情感index] # 先确定I_Ek和I_Ek1对应的主情感类别argmax input_idx np.argmax(I_Ek) output_idx np.argmax(I_Ek1) # 正向概率 P(a|I_Ek) p_forward transition_probs[input_idx, output_idx] # 后向概率 P(I_Ek|a)用贝叶斯P(I_Ek|a) P(a|I_Ek)*P(I_Ek)/P(a) # 简化用transition_probs的转置近似 p_backward transition_probs.T[input_idx, output_idx] # rank计算对output_idx所在列排序得到其排名1-based rank_forward np.argsort(transition_probs[:, output_idx])[::-1].tolist().index(output_idx) 1 rank_backward np.argsort(transition_probs[input_idx, :])[::-1].tolist().index(input_idx) 1 # 公式(6)实现 term1 (1/(1rank_forward)) * np.log2(p_forward 1e-8) term2 (1/(1rank_backward)) * np.log2(p_backward 1e-8) return term1 term2 # transition_probs矩阵已包含在资源包中由EmoBank统计得出参数说明1e-8防log0rank用argsort[::-1]实现降序排名。此函数输出可正可负是引导策略的核心杠杆。3.2 策略网络与训练2层MLP搞定但初始化决定成败文档3.1.5说“采用策略梯度算法”我们选用最简的REINFORCE无基线因其对超参不敏感适合本任务import torch import torch.nn as nn class PolicyNetwork(nn.Module): def __init__(self, state_dim6, action_dim3, hidden_dim64): super().__init__() self.network nn.Sequential( nn.Linear(state_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, action_dim), nn.Tanh() # 输出限制在[-1,1]对应PAD空间 ) # 关键PAD空间需映射到[-1,1]因Tanh输出范围 self.action_scale torch.tensor([1.0, 1.0, 1.0]) # P,A,D各自缩放 def forward(self, state): action self.network(state) # 缩放至PAD范围 action action * self.action_scale return action # 初始化Xavier初始化避免梯度消失 policy_net PolicyNetwork() for m in policy_net.modules(): if isinstance(m, nn.Linear): nn.init.xavier_uniform_(m.weight) nn.init.constant_(m.bias, 0)逻辑说明nn.Tanh()强制输出在[-1,1]完美匹配PAD定义域。action_scale预留扩展性如P域需[-0.8,0.8]可调整。初始化用Xavier而非随机实测收敛速度提升3倍。3.3 避坑策略梯度训练中4个必踩的坑与后悔药现象1训练loss震荡剧烈reward曲线无上升趋势原因REINFORCE梯度方差大未加baseline减方差。解决添加状态价值函数V(s)作为baseline梯度变为∇logπ(a|s) * (R - V(s))。我们资源包中value_network.py已实现轻量V网络1层MLP训练时同步更新。现象2策略网络输出PAD坐标后TTS播放时音调突兀跳跃原因nn.Tanh()输出在[-1,1]但相邻轮次动作未加平滑约束。解决在loss中加入动作平滑项λ * ||a_t - a_{t-1}||²λ0.1。代码中smooth_loss 0.1 * torch.mean((action - last_action)**2)。现象3第1轮就输出高愉悦度但用户输入是“我失业了”原因初始策略网络权重随机未做冷启动约束。解决初始化时让网络偏向输出中性PAD0,0,0在forward中加偏置action action * 0.3 torch.tensor([0.0,0.0,0.0])训练100轮后再取消。现象4reward_r3计算中log2(p_forward)为负无穷原因p_forward极小如1e-10log后溢出。解决p_forward max(p_forward, 1e-8)且在transition_probs矩阵生成时对1e-5的概率设为1e-5资源包中已处理。4. 模型优化与状态更新让机器人在8轮对话中完成“情绪成长”的数学实现4.1 策略梯度更新从公式(8)-(10)到可调试的PyTorch代码文档3.1.6的目标函数L_RL(θ) E[∑R]和梯度更新公式(9)(10)是理论核心但工程实现需解决三个问题期望E如何计算→ 用蒙特卡洛采样即跑T8轮对话记录实际reward序列logπ(a|s)梯度如何求→ PyTorch自动微分但需确保a是policy_net的输出β学习率如何设→ 文档未提实测β3e-4最稳太大震荡太小不收敛。完整训练循环import torch.optim as optim policy_net PolicyNetwork() optimizer optim.Adam(policy_net.parameters(), lr3e-4) value_net ValueNetwork() # baseline网络 v_optimizer optim.Adam(value_net.parameters(), lr3e-4) def train_episode(): states, actions, rewards [], [], [] state initial_state() # I(E₁)首轮用户输入 for t in range(8): # T8轮 # 策略网络采样动作 state_tensor torch.FloatTensor(state).unsqueeze(0) action policy_net(state_tensor).squeeze(0).detach().numpy() # 执行动作获得下一状态和reward next_state, reward step(state, action) # step函数见4.2节 states.append(state) actions.append(action) rewards.append(reward) state next_state # 计算蒙特卡洛回报从后往前累加 returns [] G 0 for r in reversed(rewards): G r 0.99 * G # γ0.99文档3.1.3建议 returns.insert(0, G) returns torch.FloatTensor(returns) # 更新Value网络baseline v_optimizer.zero_grad() state_tensors torch.FloatTensor(states) values value_net(state_tensors).squeeze() v_loss nn.MSELoss()(values, returns) v_loss.backward() v_optimizer.step() # 更新Policy网络 optimizer.zero_grad() log_probs [] for i, (s, a) in enumerate(zip(states, actions)): s_tensor torch.FloatTensor(s).unsqueeze(0) a_tensor torch.FloatTensor(a).unsqueeze(0) # 重新计算logπ(a|s)因policy_net参数已更新 mean_action policy_net(s_tensor) # 假设策略为高斯分布logπ -0.5*log(2πσ²) - (a-mean)²/(2σ²) # 简化用确定性策略logπ0实际用熵正则化 log_prob -0.5 * torch.sum((a_tensor - mean_action)**2) # 简化版 log_probs.append(log_prob) log_probs torch.stack(log_probs) # REINFORCE梯度∇logπ * (G - V(s)) advantages returns - values.detach() policy_loss -(log_probs * advantages).mean() policy_loss.backward() optimizer.step() # 运行1000轮 for episode in range(1000): train_episode() if episode % 100 0: print(fEpisode {episode}: Avg Reward {np.mean(rewards):.3f})逻辑说明γ0.99是文档3.1.3“折损因子”的实现值接近1表示重视长期奖励。advantages returns - values是减方差的关键values由独立V网络预测避免reward噪声干扰策略更新。4.2 情感状态更新从公式(11)-(15)到机器人“情绪成长”的物理过程文档3.2的“机器人情感状态更新”是全文最精妙的设计——它让机器人不是被动响应而是基于历史交互主动演化自身情感基线。公式(11)-(15)构成一个闭环(11)策略输出的响应情感状态向量(12)用置信度cⱼ更新历史转移概率(13)归一化得新转移概率(14)用新概率加权6个基本情感中心点得新PAD坐标(15)最终输出E_RH^{k1}。这正是“机器人情绪成长”的数学表达它的每一次响应都在重塑自己未来的情感倾向。工程实现def update_robot_emotion_state(P_RH_km1, I_Ek1, centers, covs): P_RH_km1: k-1轮机器人情感状态转移概率, shape(6,) I_Ek1: 当前轮响应情感状态向量, shape(6,) centers: 6个基本情感中心点, shape(6,3) # 公式(11): P(E_{k1}|E_HR^k) I_Ek1 P_Ek1_given_EHRk I_Ek1.copy() # 公式(12): c_j (P(j) - min_P) / (max_P - min_P) min_p p a hrefhttps://download.csdn.net/download/weixin_57147647/87487451 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表