如何求强化学习最优解

在一篇文章强化学习与马尔可夫决策中,介绍了使用马尔可夫决策过程对强化学习的过程进行建模。通过建模可以得出,只要求解最优价值函数,即可得到对应的最优策略。那么如何求解最优价值函数呢?本篇文章将介绍一些最优价值函数的求解算法。

predict和control

首先介绍一下强化学习的两个基本问题,预测和控制。

predict

在已知状态集SS,动作集AA,模型状态转化概率矩阵PP,即时奖励RR,衰减因子γ\gamma的条件下,给定策略π\pi,预测该策略的状态价值函数v(π)v(\pi)。这一过程一般称为策略评估。

阅读全文 »

强化学习与马尔可夫决策

在上一篇文章 强化学习的基本概念 中,用大白话介绍了强化学习的一些基本概念,尤其是强化学习的基本过程。在了解了强化学习的基本概念之后,在本篇文章中,笔者将介绍一下马尔可夫决策过程,用马尔可夫决策过程来形式化的描述强化学习。

强化学习与马尔可夫决策过程

首先回顾一下Agent与Environment交互的过程。

在每一个时刻tt,Agent会观察到Environment的状态ss

阅读全文 »

使用Javassist实现动态代理

动态代理是Java开发中常用的一种设计模式,相比于静态代理方式,动态代理毫无疑问更加灵活,可以在运行时对目标实例进行代理增加,以此对实例方法进行各种增强。在本篇文章中,笔者将介绍如何使用Java字节码操作库Javassist实现动态代理机制。

实现方式

Javassist实现动态代理机制的方式有两种,一种是使用Javassist提供的ProxyFactory实现,实现方式与JDK类似。另一种是使用Javassist操作字节码,自主实现动态代理机制。两种方式各有好处,前者比较简单,容易上手,后者比较复杂,但好在足够灵活,甚至可以复用JDK的InvocationHandler。下面笔者将介绍后者的实现思路!

阅读全文 »

强化学习的基本概念

强化学习是机器学习领域的一个分支,通过不断的与环境交互,不断的积累经验,最后让Agent学会如何在目标环境中取得最高的得分。在本篇文章中,笔者将介绍一些强化学习的基础知识,文章中不会涉及任何数学公式。

强化学习的基本过程

强化学习RL的整个过程就好比一个游戏玩家去探索一款新的游戏,通过一次一次的与游戏交互,学会一套操作得到最高分。

玩家是怎么探索游戏的呢?首先玩家观察游戏的场景,往往是游戏当前的图像。

阅读全文 »

自己动手实现Spring之Spring-Toy重构v0.2

在上一篇文章自己动手实现Spring中,介绍了本人自己实现的一个简单的IOC容器spring-toy。spring-toy的v0.1版本初步实现了IOC容器,但并没有实现AOP 功能。

在v0.2版本中,实现了以下功能:

  1. 支持通过FactoryBean注入单实例到容器中。
  2. 支持AOP。可以通过将目标实例,Advisor或者Advice配置到ProxyFactoryBean实例,并将ProxyFactoryBean实例注入到容器中的方式实现AOP拦截。
  3. 同时支持使用AspectJ的注解,声明Aspect以及通知,实现AOP拦截。

v0.2版本基本实现了SpringAOP的基本功能,在本篇文章中,将介绍笔者是如何实现的AOP功能。

阅读全文 »

配置MSI GPU 深度学习环境

配置MSI GPU 深度学习环境

安装 Ubuntu 18.04, CUDA, CDNN, Pytorch 和 TensorFlow

安装 Ubuntu 18.04

获取镜像

https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0

安装

  • 关闭Security boot (可以在BIOS里进行关闭,对于MSI电脑,重启操作系统,在系统载入前,不断按delete键进入BIOS)
阅读全文 »

Java集合类常见的问题

本篇文章将尝试回答一些Java集合类常见的问题,以作知识梳理之用。

ArrayList和LinkList以及Vector的区别

就实现方式而言:

  • ArrayList是以数组的方式实现的列表。

  • LinkList是以双向链表的形式实现的列表。

  • Vector也是以数组的方式实现的列表,但Vector是一个采用了同步技术的线程安全的列表。

就使用场景而言:

阅读全文 »

Java中需要知道的关键字

Java中有一些或常用,或不常用,但却不得不知关键字,本篇文章将讨论这些关键字的作用。

transient

transient关键字可能用的不是那么频繁,但却是一个很重要的关键字,它的作用是在对象序列化过程中体现的。如果一个类的变量被transient修饰,那么这个对象在序列化过程中,不会序列化这个变量,同时,在反序列化过程中,也不会去反序列这个变量。

阅读全文 »

自己动手写Spring

众说周知,Spring是一个具有强大的依赖注入功能的Java框架。本篇文章将介绍笔者自己动手写的一个轻量级依赖注入框架,实现jsr330并兼容jsr330注解。

完整代码托管在github中,可以点击https://github.com/bdqfork/spring-toy 查看完整项目。

另笔者开发经验不足,欢迎大家指正批评。

阅读全文 »

使用PyTorch进行深度学习

译者:bdqfork

作者: Robert Guthrie

深度学习构建模块:仿射映射, 非线性函数以及目标函数

深度学习表现为使用更高级的方法将线性函数和非线性函数进行组合。非线性函数的引入使得训练出来的模型更加强大。

阅读全文 »