UVA 10066 The Twin Towers 双塔 LCS,dp

题意:求最长公告子序列。

裸体,压缩了空间做的,O(n^2)做法,有空研究下nlogn做法。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.youkuaiyun.com/hcbbt
*  File:        uva10066.cpp
*  Create Date: 2013-09-21 09:31:21
*  Descripton:  dp, LCS 
*/

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 101;
int n, m, dp[2][MAXN], a[MAXN], b[MAXN];

int main() {
	int cas = 0, k = 1;
	while (scanf("%d%d", &n, &m) && (n || m)) {
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);
		for (int j = 1; j <= m; j++) {
			scanf("%d", &b[j]);
			dp[0][j] = dp[1][j] = 0;
		}
		for (int i = 1; i <= n; i++) {
			k = !k;
			for (int j = 1; j <= m; j++)
				if (a[i] == b[j])
					dp[k][j] = max(dp[!k][j - 1] + 1, dp[k][j]);
				else
					dp[k][j] = max(dp[k][j - 1], dp[!k][j]);
		}
		printf("Twin Towers #%d\n", ++cas);
		printf("Number of Tiles : %d\n\n", dp[k][m]);
	}
	return 0;
}



<think>好的,我现在需要回答用户关于双塔模型的架构设计和工作原理的问题。首先,我需要回顾一下自己对这个主题的理解。双塔模型在推荐系统中应用广泛,主要用于处理用户和物品的嵌入表示,然后通过计算它们的相似度来进行推荐。 根据用户提供的引用资料,特别是引用[3],双塔模型的结构包括两个独立的塔,一个是用户塔,另一个是物品塔。两个塔的最后一层隐藏单元数量相同,这样可以保证生成的用户嵌入和物品嵌入维度一致,便于后续的相似度计算,比如内积或余弦相似度。引用中还提到,双塔模型无法像DeepFM那样使用用户和物品的交叉特征,这说明它的设计更侧重于独立的特征处理。 接下来,我需要考虑双塔模型的工作原理。根据引用[2],双塔模型可能涉及到知识蒸馏,即一个复杂的教师模型将知识传递给轻量级的学生模型。不过这可能更多是训练策略,而架构本身是分开处理用户和物品的特征。另外,引用[4]中的代码示例显示模型输入是用户和物品的特征,输出是相似度,这进一步验证了双塔模型的结构。 架构设计方面,需要明确每个塔的结构。用户塔处理用户相关的特征,比如用户历史行为、人口统计信息等;物品塔处理物品属性、内容特征等。每个塔通常由多层全连接网络构成,最后输出嵌入向量。然后通过内积或其他相似度计算方式得到匹配分数,用于推荐排序。 可能还需要讨论双塔模型的优缺点。优点包括结构清晰、易于扩展和部署,尤其是在大规模推荐系统中,可以预先计算物品嵌入,减少线上计算压力。缺点是无法捕捉用户和物品的交叉特征,可能影响模型的表现力。 用户可能还关心训练方法,比如损失函数的选择。引用[3]提到使用二分类交叉熵损失函数,这适用于点击率预测等任务。此外,负采样策略在训练中也很重要,因为物品数量庞大,无法对所有负样本进行计算。 最后,需要检查是否有遗漏的信息,比如多目标多塔召回模型(引用[1]),这可能涉及多个塔处理不同目标,但用户当前的问题集中在基础双塔模型上,所以可能不需要深入多目标部分,但可以简要提及扩展应用。 总结回答结构:先介绍架构设计,分用户塔和物品塔;再讲工作原理,包括特征处理、嵌入生成、相似度计算;然后讨论优缺点和常见应用场景;最后根据引用资料补充实现细节,如损失函数和模型代码结构。</think>### 双塔模型的架构设计和工作原理 #### 一、架构设计 双塔模型的核心设计是**用户塔**和**物品塔**两个独立的深度神经网络(DNN),分别处理用户特征和物品特征,最终生成维度相同的嵌入向量(Embedding)。 1. **用户塔**:输入用户特征(如历史行为、用户画像、上下文信息等),通过多层全连接网络生成用户嵌入$u$。 2. **物品塔**:输入物品特征(如文本描述、标签、统计信息等),通过对称结构的DNN生成物品嵌入$v$。 3. **相似度计算**:通过内积$u \cdot v$或余弦相似度$\cos(u, v)$衡量用户与物品的匹配度[^3]。 #### 二、工作原理 1. **特征输入与处理** - 用户侧特征:包括用户ID、点击历史、地理位置等,需经过Embedding层或数值归一化处理。 - 物品侧特征:如物品ID、标题、类目等,同样通过Embedding或数值编码输入塔中。 2. **嵌入生成** 两塔的最后一层全连接层维度需对齐,例如均输出$d$维向量: $$ u = f_{\text{user}}(X_{\text{user}}), \quad v = f_{\text{item}}(X_{\text{item}}) $$ 3. **匹配与损失函数** 相似度得分用于训练模型,常见损失函数为二分类交叉熵损失(如点击率预测任务): $$ \mathcal{L} = -\sum_{(u,v)} y \log(\sigma(u \cdot v)) + (1-y) \log(1-\sigma(u \cdot v)) $$ 其中$y$为标签(点击/未点击),$\sigma$为Sigmoid函数。 #### 三、特点与局限性 - **优点**: - **高效检索**:物品嵌入可离线计算,线上仅需实时生成用户嵌入,适合大规模推荐场景。 - **解耦设计**:用户塔与物品塔可独立优化,支持多任务学习或分阶段训练。 - **缺点**: - **特征交叉缺失**:无法直接建模用户与物品的交互特征(如DeepFM中的交叉层)[^3]。 - **表达能力受限**:轻量级设计可能损失复杂特征的捕捉能力,需依赖知识蒸馏等优化(如教师-学生模型)[^2]。 #### 四、代码示例(基于引用[4]) ```python # 用户塔和物品塔定义 user_input = Input(shape=(user_feature_dim,), name='user_input') item_input = Input(shape=(item_feature_dim,), name='item_input') user_tower = Dense(128, activation='relu')(user_input) user_tower = Dense(64, activation='relu')(user_tower) user_embedding = Dense(32)(user_tower) # 输出32维用户嵌入 item_tower = Dense(128, activation='relu')(item_input) item_tower = Dense(64, activation='relu')(item_tower) item_embedding = Dense(32)(item_tower) # 输出32维物品嵌入 # 相似度计算(内积) similarity = Dot(axes=1, normalize=False)([user_embedding, item_embedding]) model = Model(inputs=[user_input, item_input], outputs=similarity, name='twin_towers_model') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值