您如何将 2D 矩阵表示为输入状态,并让它选择它认为对该状态最佳操作的行的索引?

Posted

技术标签:

【中文标题】您如何将 2D 矩阵表示为输入状态,并让它选择它认为对该状态最佳操作的行的索引?【英文标题】:How would you represent a 2D matrix as an input state and have it select the index of the row it thinks is the best action for that state? 【发布时间】:2021-02-16 18:59:53 【问题描述】:

我正在尝试构建一个 RL 模型,其中输入是 NxM 矩阵,N 是可选择动作的数量,M 是描述动作的特征。

到目前为止,在我见过的所有 RL 问题中,状态空间要么是一个向量并传入常规神经网络,要么是图像并通过卷积神经网络传入。

但是假设我们有一个环境,目标是学习为固定任务选择最强的工作人员,单个状态表示如下所示:


names = ['Bob','Henry','Mike','Phil']
max_squat = [300,400,200,100]
max_bench = [200,100,225,100]
max_deadlift = [600,400,300,225]
strongest_worker_df = pd.DataFrame('Name':names,'Max_Squat':max_squat,'Max_Bench':max_bench,'Max_Deadlift':max_deadlift)

我想传入这个二维矩阵(当然没有 Name 列)作为输入并让它返回一个行索引,然后将该行索引作为一个动作传递给环境并获得奖励。然后根据动作选择的奖励梯度运行强化学习算法。

关于如何解决这个问题,特别是状态表示有什么建议吗?

【问题讨论】:

【参考方案1】:

只要你的矩阵是固定大小的(N 和 M 不变),你可以将它向量化(连接行),网络就会像这样工作。

这样做可能不是最理想的,因为考虑到问题设置,最好将每一行通过相同的神经网络来获取特征,然后有一个对连接特征进行操作的***鉴别器。

执行此操作的示例模型(在 TensorFlow 代码中)是:

model_input = x = Input(shape=(N, M))
x = Dense(64, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(32, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(16, activation='relu')(x)
x = Dropout(0.1)(x)

# The layers above this line define the feature generator, at this point
# your model has 16 fetaures for every person, i.e. an Nx16 matrix.
# Each person's feature have gone through the same nodes and have received
# the same transformations from them.

x = Flatten()(x)

# The Nx16 matrix is now flattened and below define the discriminator
# which will have a softmax output of size N (the highest output identifies
# the selected index)

x = Dense(16, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(16, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(16, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(N, activation='softmax')(x)


model = Model(inputs=model_input, outputs=x)

【讨论】:

以上是关于您如何将 2D 矩阵表示为输入状态,并让它选择它认为对该状态最佳操作的行的索引?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以添加文本(占位符或标签)来输入type =“color”并让它可以点击? [关闭]

将二维数组转换为犰狳矩阵(垫)对象

在 2D 向量上执行单行算术以找到简化的行形式 C++

如何使用opencv C ++将3D矩阵划分为2D矩阵束

iPhone - 我如何隐藏视图并让它的空间被其他视图使用(如 android visibility = GONE)

iPhone - 我如何隐藏视图并让它的空间被其他视图使用(如 android visibility = GONE)