# SOLsim 2代 **Repository Path**: solsim/solsim-2G ## Basic Information - **Project Name**: SOLsim 2代 - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-13 - **Last Updated**: 2022-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SOLsim 二代 ## 简介 SOLsim::Model2G 是一系列采用千奇百怪的方法设计的文本生成模型。其设计初衷是模拟SOL在群内的发言方式,但是(当然)这个任务看起来任重而道远。所以,为了更有计划地实现阶段性目标,我们将SOLsim按代划分。 SOLsim一代仍将作为“Naive自动对话生成”模型持续更新。 ### 设计 SOLsim::Model2G基本上完全摈弃了根据语料库中句子的分布生成单字的方案;这一方案会导致生成器基本上只会输出语料库中的现有文本,而且在大多数情况下(因为模型自身复杂度不够)生成的句子并不通顺。 目前,我们对于2代的设计思路为: - 直接使用QQ群内数据集(避免奇奇怪怪的数据噪声) - 发言不再仅结合前1句,而是以前若干句作为输入 - 模型的功能为: + 自动判断是否应当发言(二分类判定问题) + 筛选当前发言与哪些已有句子关联(以句为单位的Attention) + 根据当前上下文环境,生成句子(暂不考虑知识图谱) ### 版本号规则 我们采用如下规则命名版本号: ``` Generation-Part-Model.Loss.Param--epoch ``` 其中,text description可以有多个,每个均为缩写或缩写+数字的组合,表达某一个超参数的数量或设置。例如: ``` 2G-shall-1.4.5-gan-negspl4-022 ``` 意味着这是一个2代模型的“判断是否发言”部分,采用第1版模型结构、第4版loss function、进行第5次训练的第22个epoch所得到参数;该模型可能采用生成对抗网络(gan)训练,并且有4个负采样(neg sample)。 若采用多个“部分”联合训练,则全部写明,part之间用“-”(短横线)隔开。 ## 数据 mirai项目的存在,让轻松生成QQ群数据集成为了可能。 二代SOLsim将基于若干个活跃群聊进行采样,采样内容多半为长对话;其中每一条对话记录包含以下内容: ``` uid: 用户 timestamp: 时间 content: 文本内容(多媒体格式将被忽略) ``` 具体存储格式以[SOLsim::Bot]()的实现为准。 ## 部分 如版本号一节中所介绍的,二代模型大概将要分为若干个部分;每一个部分的模型结构、训练方法都完全不同。 将来将根据实际效果选择分别训练、联合训练、对抗训练等训练方式。 ### 判定部分 - 功能:判断模型在当前语境下是否应该进行输出。 - 标注:半监督;可以根据sol的实际发言结果标注sol的行为。 - 分析:实际上本模型会以句子为单位,判断是否包含sol感兴趣的话题。如果存在,并且机会合适,sol就接话。 - 输入:前K句话 - 输出:K+1维softmax概率向量 - 对于前K维: - 0:sol不应该根据这句话进行答复 - 1:sol应该根据这句话进行答复 - 对于第K+1维: - 0:sol应该发言 - 1:sol不应该发言 ### 关联部分 - 功能:判断模型作为输入的句子之间的联系;判断模型当前输出应当与输入中哪几句话相关联。 - 标注:无监督;这更像是一个聚类问题。 - 分析:提取句子Embedding的部分应该和判定部分共用相同的参数。 - 输入:前K句话 - 输出:K×K的矩阵,第i行第j列表示第i句、第j句输入之间的关联性 - 1:两句话很有可能共同出现 - -1:两句话几乎不应该共同出现(依赖于负采样) - 0:两句话无关 ### 生成部分 - 功能:根据筛选出来的“相关句子”的Embedding,生成作为下一句发言的句子。 - 标注:半监督;以SOL的真实发言作为基准 - 分析:这一部分可能是和1G最相近的部分;然而从目前的结果来看,1G的模型是不能胜任的,它的模型复杂度似乎并不足以区分句子,导致多个不同(甚至无关)的输入会映射到相同的输出。我们必须考虑更强大的模型;但是仍然限定在一个双核CPU、8G内存能够训练,且一个移动端设备能够轻松运行的范围之内。 - 输入:前k句话(包含于前K句话当中) - 输出:作为应答的句子;更具体而言,我们可能会考虑3类不同的生成方式: - Charater Based:以字为单位的生成,1G采用的就是本方案; - Phrase Based:以短语/词语为单位的生成,可能会做出一个短语库;但1代模型没有采用此方案的原因是短语库的基数可能比字库大太多; - Sentence Based:以句子为单位的生成,一次生成整个句子,实际长度由终结符的位置决定。 ## 版本 所有版本更新将在这里记录。由于1G中的记录相对散乱,我们这里规定记录的格式: ``` ### 版本号(代号) - 实验方案 - 实验理论的具体性阐述,若有引用需标注出处 - 结果记录与分析 - 记录实现此方案得到的结果,并分析原因 - 备注 - 随便写,允许使用很口语化的表述,亦可记录一些梗 ``` ## 引用与致谢 所有在本项目当中用到的文献/数据集/工具等软件均会列举在此处。 - …… - mirai bot项目 - 以及前代SOLsim所提到的所有引用。 ## 参与者 SOL ## 一些其他的话 ### 关于所谓圈juan内风气 我是真的奉劝某些小学生稍微长点脑子。 互联网和开源社区不是你他妈占山为王的地方,也不是你他妈以为自己掌握了一点点“术”就了不起了的地方。何况您还不是真掌握了。 希望社区不要让少数几个人把自己搞臭了。 顺带一说,我特别想收集一下某些人的语料库,这样当SOLsim-“小学生令堂入灵堂特供版”训练出来的时候就可以以彼之道还施彼身。 本文档此章节将在必要时继续更新。