avatarSayantini Deb

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

6951

Abstract

change the Equation.</p><p id="d8ef"><b>V(s) = max(R(s, a) + 𝜸 V(s’))</b></p><p id="9424"><b>V(s) = max(R(s, a) + 𝜸 Σ s’ P(s, a, s’) V(s’))</b></p><p id="200c"><b>Σ s’ P(s,a,s’) V(s’) : </b>Randomness Expectations of Robot</p><figure id="8e0d"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*uRwY-mY0DbIkbQpPeJaKaQ.png"><figcaption></figcaption></figure><p id="66cb"><b>V(s) = max(R(s, a) + 𝜸 ((0.8V(room up)) + (0.1V(room down) + ….))</b></p><p id="25ae">Now, Let’s transition into Q Learning. Q-Learning poses an idea of assessing the quality of an action that is taken to move to a state rather than determining the possible value of the state it is being moved to.</p><figure id="0afe"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*0rgOhV5EG7rkR7U_lAkqTA.png"><figcaption></figcaption></figure><p id="dd09">This is what we get if we incorporate the idea of assessing the quality of actions for moving to a certain state s′. From the updated Bellman Equation if we remove them <b>max </b>component, we are assuming only one footprint for possible action which is nothing but the <b>Quality</b> of the action.</p><p id="bb21"><b>Q(s, a) = (R(s, a) + 𝜸 Σ s’ P(s, a, s’) V(s’))</b></p><p id="9886">In this equation that Quantifies the Quality of action, we can assume that V(s) is the maximum of all possible values of Q(s, a). So let’s replace v(s’) with a function of Q().</p><p id="e55b"><b>Q(s, a) = (R(s, a) + 𝜸 Σ s’ P(s, a, s’) max Q(s’, a’))</b></p><p id="56ef">We are just one step close to our final Equation of Q Learning. We are going to introduce a <b>Temporal Difference</b> to calculate the Q-values with respect to the changes in the environment over time. But how do we observe the change in Q?</p><p id="0c51"><b>TD(s, a) = (R(s, a) + 𝜸 Σ s’ P(s, a, s’) max Q(s’, a’)) — Q(s, a)</b></p><p id="0903">We recalculate the new Q(s, a) with the same formula and subtract the previously known Q(s, a) from it. So, the above equation becomes:</p><p id="51c7"><b>Qt (s, a) = Qt-1 (s, a) + α TDt (s, a)</b></p><p id="7eea"><b>Qt (s, a) = </b>Current Q-value</p><p id="9af5"><b>Qt-1 (s, a) = </b>Previous Q-value</p><p id="9ac9"><b>Qt (s, a) = Qt-1 (s, a) + α (R(s, a) + 𝜸 max Q(s’, a’) — Qt-1(s, a))</b></p><h1 id="832c">Demo: NumPy</h1><p id="04c2">I am going to use Python NumPy to demonstrate how Q Learning works.</p><p id="d85c"><b>Step 1: Imports, Parameters, States, Actions, and Rewards</b></p><div id="5aad"><pre>import numpy <span class="hljs-keyword">as</span> np

gamma = <span class="hljs-number">0.75</span> <span class="hljs-meta"># Discount factor</span> alpha = <span class="hljs-number">0.9</span> <span class="hljs-meta"># Learning rate</span>

location_to_state = { <span class="hljs-string">'L1'</span> : <span class="hljs-number">0</span>, <span class="hljs-string">'L2'</span> : <span class="hljs-number">1</span>, <span class="hljs-string">'L3'</span> : <span class="hljs-number">2</span>, <span class="hljs-string">'L4'</span> : <span class="hljs-number">3</span>, <span class="hljs-string">'L5'</span> : <span class="hljs-number">4</span>, <span class="hljs-string">'L6'</span> : <span class="hljs-number">5</span>, <span class="hljs-string">'L7'</span> : <span class="hljs-number">6</span>, <span class="hljs-string">'L8'</span> : <span class="hljs-number">7</span>, <span class="hljs-string">'L9'</span> : <span class="hljs-number">8</span> }

actions = [<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>]

rewards = np.array([[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>], [<span class="hljs-meta">1,0,1,0,0,0,0,0,0</span>], [<span class="hljs-meta">0,1,0,0,0,1,0,0,0</span>], [<span class="hljs-meta">0,0,0,0,0,0,1,0,0</span>], [<span class="hljs-meta">0,1,0,0,0,0,0,1,0</span>], [<span class="hljs-meta">0,0,1,0,0,0,0,0,0</span>], [<span class="hljs-meta">0,0,0,1,0,0,0,1,0</span>], [<span class="hljs-meta">0,0,0,0,1,0,1,0,1</span>], [<span class="hljs-meta">0,0,0,0,0,0,0,1,0</span>]])</pre></div><p id="8a6f"><b>Step 2: Map Indices to locations</b></p><div id="04dd"><pre>state_to_location = dict((<span class="hljs-keyword">state</span>,location) <span class="hljs-keyword">for</span> location,<span class="hljs-keyword">state</span> <span class="hljs-keyword">in</span> location_to_state.items())</pre></div><p id="f3ac"><b>Step 3: Get Optimal Route using Q Learning Process</b></p><div id="1352"><pre><span class="hljs-attribute">def</span> get_optimal_route(start_location,end_location): <span class="hljs-attribute">rewards_new</span> = np.copy(rewards) <span class="hljs-attribute">ending_state</span> = location_to_state[end_location] <span class="hljs-attribute">rewards_new</span>[ending_state,ending_state] = <span class="hljs-number">999</span>

<span class="hljs-attribute">Q</span> = np.array(np.zeros([<span class="hljs-number">9</span>,<span class="hljs-number">9</span>]))

<span class="hljs-comment"># Q-Learning process</span>
<span class="hljs-attribute">for</span> i in range(<span class="hljs-number">1000</span>):
    <span class="hljs-comment"># Picking up a random state</span>
    <span class="hljs-attribute">current_state</span> = np.random.randint(<span class="hljs-number">0</span>,<span class="hljs-number">9</span>) # Python excludes the upper bound
    <span class="hljs-attribute">playable_actions</span> =<span class="hljs-meta"> []</span>
    <span class="hljs-comment"># Iterating through the new rewards matrix</span>
    <span class="hljs-attribute">for</span> j in range(<span class="hljs-number">9</span>):
        <span class="hljs-attribute">if</span> rewards_new[current_state,j] &gt; <span class="hljs-number">0</span>:
            <span class="hljs-attribute">playable_actions</span>.append(j)
    <span class="hljs-comment"># Pick a random action that will lead us to next state</span>
    <span class="hljs-attribute">next_state</span> = np.random.choice(playable_actions)
    <span class="hljs-comment"># Computing Temporal Difference</span>
    <span class="hljs-attribute">TD</span> = rewards_new[current_state,next_state] + gamma * Q[next_state, np.argmax(Q[next_state,])] - Q[current_state,next_state]
    <span class="hljs-comment"># Updating the Q-V

Options

alue using the Bellman equation</span> <span class="hljs-attribute">Q</span>[current_state,next_state] += alpha * TD

<span class="hljs-comment"># Initialize the optimal route with the starting location</span>
<span class="hljs-attribute">route</span> =<span class="hljs-meta"> [start_location]</span>
<span class="hljs-comment">#Initialize next_location with starting location</span>
<span class="hljs-attribute">next_location</span> = start_location

<span class="hljs-comment"># We don't know about the exact number of iterations needed to reach to the final location hence while loop will be a good choice for iteratiing</span>
<span class="hljs-attribute">while</span>(next_location != end_location):
    <span class="hljs-comment"># Fetch the starting state</span>
    <span class="hljs-attribute">starting_state</span> = location_to_state[start_location]
    <span class="hljs-comment"># Fetch the highest Q-value pertaining to starting state</span>
    <span class="hljs-attribute">next_state</span> = np.argmax(Q[starting_state,])
    <span class="hljs-comment"># We got the index of the next state. But we need the corresponding letter.</span>
    <span class="hljs-attribute">next_location</span> = state_to_location[next_state]
    <span class="hljs-attribute">route</span>.append(next_location)
    <span class="hljs-comment"># Update the starting location for the next iteration</span>
    <span class="hljs-attribute">start_location</span> = next_location

<span class="hljs-attribute">return</span> route</pre></div><p id="52e9"><b>Step 4: Print the Route</b></p><div id="90cf"><pre><span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(get_optimal_route(<span class="hljs-string">'L1'</span>, <span class="hljs-string">'L9'</span>)</span></span>)</pre></div><figure id="a13c"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*lp28gO33nucKQ3z9mZbuJQ.png"><figcaption></figcaption></figure><p id="688d">With this, we come to an end of Q-Learning. I hope you got to know the working of Q Learning along with the various dependencies there are like the temporal Difference, Bellman Equation and more.</p><p id="058d">If you wish to check out more articles on the market’s most trending technologies like Artificial Intelligence, DevOps, Ethical Hacking, then you can refer to <a href="https://www.edureka.co/blog/?utm_source=medium&amp;utm_medium=content-link&amp;utm_campaign=q-learning">Edureka’s official site.</a></p><p id="9c6c">Do look out for other articles in this series which will explain the various other aspects of Deep Learning.</p><blockquote id="f619"><p>1.<a href="https://readmedium.com/tensorflow-tutorial-ba142ae96bca"> TensorFlow Tutorial</a></p></blockquote><blockquote id="48b9"><p>2.<a href="https://readmedium.com/pytorch-tutorial-9971d66f6893"> PyTorch Tutorial</a></p></blockquote><blockquote id="33d2"><p>3. <a href="https://readmedium.com/perceptron-learning-algorithm-d30e8b99b156">Perceptron learning Algorithm</a></p></blockquote><blockquote id="95bf"><p>4. <a href="https://readmedium.com/neural-network-tutorial-2a46b22394c9">Neural Network Tutorial</a></p></blockquote><blockquote id="5ca7"><p>5.<a href="https://readmedium.com/backpropagation-bd2cf8fdde81"> What is Backpropagation?</a></p></blockquote><blockquote id="f372"><p>6. <a href="https://readmedium.com/convolutional-neural-network-3f2c5b9c4778">Convolutional Neural Networks</a></p></blockquote><blockquote id="3ac7"><p>7.<a href="https://readmedium.com/capsule-networks-d7acd437c9e"> Capsule Neural Networks</a></p></blockquote><blockquote id="7532"><p>8.<a href="https://readmedium.com/recurrent-neural-networks-df945afd7441"> Recurrent Neural Networks</a></p></blockquote><blockquote id="f507"><p>9. <a href="https://readmedium.com/autoencoders-tutorial-cfdcebdefe37">Autoencoders Tutorial</a></p></blockquote><blockquote id="c366"><p>10. <a href="https://readmedium.com/restricted-boltzmann-machine-tutorial-991ae688c154">Restricted Boltzmann Machine Tutorial</a></p></blockquote><blockquote id="231c"><p>11. <a href="https://readmedium.com/pytorch-vs-tensorflow-252fc6675dd7">PyTorch vs TensorFlow</a></p></blockquote><blockquote id="394c"><p>12. <a href="https://readmedium.com/deep-learning-with-python-2adbf6e9437d">Deep Learning With Python</a></p></blockquote><blockquote id="c256"><p>13. <a href="https://readmedium.com/artificial-intelligence-tutorial-4257c66f5bb1">Artificial Intelligence Tutorial</a></p></blockquote><blockquote id="d310"><p>14. <a href="https://readmedium.com/tensorflow-image-classification-19b63b7bfd95">TensorFlow Image Classification</a></p></blockquote><blockquote id="953d"><p>15. <a href="https://readmedium.com/artificial-intelligence-applications-7b93b91150e3">Artificial Intelligence Applications</a></p></blockquote><blockquote id="5b0c"><p>16. <a href="https://readmedium.com/become-artificial-intelligence-engineer-5ac2ede99907">How to Become an Artificial Intelligence Engineer?</a></p></blockquote><blockquote id="dc81"><p>17. <a href="https://readmedium.com/tensorflow-object-detection-tutorial-8d6942e73adc">Object Detection in TensorFlow</a></p></blockquote><blockquote id="8ffb"><p>18. <a href="https://readmedium.com/apriori-algorithm-d7cc648d4f1e">Apriori Algorithm</a></p></blockquote><blockquote id="f3ca"><p>19. <a href="https://readmedium.com/introduction-to-markov-chains-c6cb4bcd5723">Markov Chains With Python</a></p></blockquote><blockquote id="6d99"><p>20. <a href="https://readmedium.com/artificial-intelligence-algorithms-fad283a0d8e2">Artificial Intelligence Algorithms</a></p></blockquote><blockquote id="3e4e"><p>21. <a href="https://readmedium.com/best-laptop-for-machine-learning-a4a5f8ba5b">Best Laptops for Machine Learning</a></p></blockquote><blockquote id="89f8"><p>22. <a href="https://readmedium.com/top-artificial-intelligence-tools-36418e47bf2a">Top 12 Artificial Intelligence Tools</a></p></blockquote><blockquote id="c974"><p>23. <a href="https://readmedium.com/artificial-intelligence-interview-questions-872d85387b19">Artificial Intelligence (AI) Interview Questions</a></p></blockquote><blockquote id="de36"><p>24. <a href="https://readmedium.com/theano-vs-tensorflow-15f30216b3bc">Theano vs TensorFlow</a></p></blockquote><blockquote id="5f0e"><p>25. <a href="https://readmedium.com/what-is-a-neural-network-56ae7338b92d">What Is A Neural Network?</a></p></blockquote><blockquote id="113e"><p>26. <a href="https://readmedium.com/pattern-recognition-5e2d30ab68b9">Pattern Recognition</a></p></blockquote><blockquote id="b1cc"><p>27. <a href="https://readmedium.com/alpha-beta-pruning-in-ai-b47ee5500f9a">Alpha Beta Pruning in Artificial Intelligence</a></p></blockquote><p id="449c"><i>Originally published at <a href="https://www.edureka.co/blog/q-learning/">https://www.edureka.co</a> on June 12, 2019.</i></p></article></body>

Q Learning: All you need to know about Reinforcement Learning

Q Learning — Edureka

Artificial Intelligence and Machine Learning are a few domains that are amongst the top buzzwords in the industry and for a good reason. AI is going to create 2.3 million jobs by 2020 considering its main goal is to enable machines to mimic human behavior. Odd isn’t it? So, today we are going to discuss Q Learning, the building block of Reinforcement Learning in the following order:

  • What is Reinforcement Learning?
  • Q-Learning Process
  • Bellman Equation
  • Markov Decision Process
  • Demo: NumPy

What is Reinforcement Learning?

Let’s have a look at our day to day life. We perform numerous tasks in the environment and some of those tasks bring us rewards while some do not. We keep looking for different paths and try to find out which path will lead to rewards and based on our action we improve our strategies on achieving goals. This my friends are one of the simplest analogy of Reinforcement Learning.

Key areas of Interest :

  • Environment
  • Action
  • Reward
  • State

Reinforcement Learning is the branch of machine learning that permits systems to learn from the outcomes of their own decisions. It solves a particular kind of problem where decision making is sequential, and the goal is long-term.

Q-Learning Process

Let’s understand what is Q learning with our problem statement here. It will help us to define the main components of a reinforcement learning solution i.e. agents, environment, actions, rewards, and states.

Automobile Factory Analogy:

We are at an Automobile Factory filled with robots. These robots help the Factory workers by conveying the necessary parts required to assemble a car. These different parts are located at different locations within the factory in 9 stations. The parts include Chassis, Wheels, Dashboard, Engine and so on. Factory Master has prioritized the location where chassis is being installed as the highest priority. Let’s have a look at the setup here:

States:

The Location at which a robot is present at a particular instance is called its state. Since it is easy to code it rather than remembering it by names. Let’s map the location to numbers.

Actions:

Actions are nothing but the moves made by the robots to any location. Consider, a robot is at the L2 location and the direct locations to which it can move are L5, L1 and L3. Let’s understand this better if we visualize this:

Rewards:

A Reward will be given to the robot for going directly from one state to another. For example, you can reach L5 directly from L2 and vice versa. So, a reward of 1 will be provided in either case. Let’s have a look at the reward table:

Remember when the Factory Master Prioritized the chassis location. It was L7, so we are going to incorporate this fact into our rewards table. So, we’ll assign a very large number(999 in our case) in the (L7, L7) location.

Bellman Equation

Now suppose a robot needs to go from point A to B. It will choose the path which will yield a positive reward. For that suppose we provide a reward in terms of footprint for it to follow.

But what if the robot starts from somewhere in between where it can see two or more paths. The robot can thus not take a decision and this primarily happens because it doesn’t possess a memory. This is where the Bellman Equation comes into the picture.

V(s) = max(R(s,a) + 𝜸V(s’))

Where:

  • s = a particular state
  • a = action
  • s′ = state to which the robot goes from s
  • 𝜸 = discount factor
  • R(s, a) = a reward function which takes a state (s) and action (a) and outputs a reward value
  • V(s) = value of being in a particular state

Now the block below the destination will have a reward of 1, which is the highest reward, But what about the other block? Well, this is where the discount factor comes in. Let’s assume a discount factor of 0.9 and fill all the blocks one by one.

Markov Decision Process

Imagine a robot is on the orange block and needs to reach the destination. But even if there is a slight dysfunction the robot will be confused about which path to take rather than going up.

So we need to modify the decision-making process. It has to Partly Random and Partly under the robot’s control. Partly Random because we don’t know when the robot will dysfunction and Partly under control because it’s still the robot’s decision. And this forms the base for the Markov Decision Process.

A Markov decision process (MDP) is a discrete time stochastic control process. It provides a mathematical framework for modeling decision making in situations where outcomes are partly random and partly under the control of a decision maker.

So we are going to use our original Bellman equation and make changes in it. What we don’t know is the next state ie. s’. What we know is all the possibilities of a turn and let’s change the Equation.

V(s) = max(R(s, a) + 𝜸 V(s’))

V(s) = max(R(s, a) + 𝜸 Σ s’ P(s, a, s’) V(s’))

Σ s’ P(s,a,s’) V(s’) : Randomness Expectations of Robot

V(s) = max(R(s, a) + 𝜸 ((0.8V(room up)) + (0.1V(room down) + ….))

Now, Let’s transition into Q Learning. Q-Learning poses an idea of assessing the quality of an action that is taken to move to a state rather than determining the possible value of the state it is being moved to.

This is what we get if we incorporate the idea of assessing the quality of actions for moving to a certain state s′. From the updated Bellman Equation if we remove them max component, we are assuming only one footprint for possible action which is nothing but the Quality of the action.

Q(s, a) = (R(s, a) + 𝜸 Σ s’ P(s, a, s’) V(s’))

In this equation that Quantifies the Quality of action, we can assume that V(s) is the maximum of all possible values of Q(s, a). So let’s replace v(s’) with a function of Q().

Q(s, a) = (R(s, a) + 𝜸 Σ s’ P(s, a, s’) max Q(s’, a’))

We are just one step close to our final Equation of Q Learning. We are going to introduce a Temporal Difference to calculate the Q-values with respect to the changes in the environment over time. But how do we observe the change in Q?

TD(s, a) = (R(s, a) + 𝜸 Σ s’ P(s, a, s’) max Q(s’, a’)) — Q(s, a)

We recalculate the new Q(s, a) with the same formula and subtract the previously known Q(s, a) from it. So, the above equation becomes:

Qt (s, a) = Qt-1 (s, a) + α TDt (s, a)

Qt (s, a) = Current Q-value

Qt-1 (s, a) = Previous Q-value

Qt (s, a) = Qt-1 (s, a) + α (R(s, a) + 𝜸 max Q(s’, a’) — Qt-1(s, a))

Demo: NumPy

I am going to use Python NumPy to demonstrate how Q Learning works.

Step 1: Imports, Parameters, States, Actions, and Rewards

import numpy as np
 
gamma = 0.75 # Discount factor
alpha = 0.9 # Learning rate
 
location_to_state = {
    'L1' : 0,
    'L2' : 1,
    'L3' : 2,
    'L4' : 3,
    'L5' : 4,
    'L6' : 5,
    'L7' : 6,
    'L8' : 7,
    'L9' : 8
}
 
actions = [0,1,2,3,4,5,6,7,8]
 
rewards = np.array([[0,1,0,0,0,0,0,0,0],
              [1,0,1,0,0,0,0,0,0],
              [0,1,0,0,0,1,0,0,0],
              [0,0,0,0,0,0,1,0,0],
              [0,1,0,0,0,0,0,1,0],
              [0,0,1,0,0,0,0,0,0],
              [0,0,0,1,0,0,0,1,0],
              [0,0,0,0,1,0,1,0,1],
              [0,0,0,0,0,0,0,1,0]])

Step 2: Map Indices to locations

state_to_location = dict((state,location) for location,state in location_to_state.items())

Step 3: Get Optimal Route using Q Learning Process

def get_optimal_route(start_location,end_location):
    rewards_new = np.copy(rewards)
    ending_state = location_to_state[end_location]
    rewards_new[ending_state,ending_state] = 999
 
    Q = np.array(np.zeros([9,9]))
 
    # Q-Learning process
    for i in range(1000):
        # Picking up a random state
        current_state = np.random.randint(0,9) # Python excludes the upper bound
        playable_actions = []
        # Iterating through the new rewards matrix
        for j in range(9):
            if rewards_new[current_state,j] > 0:
                playable_actions.append(j)
        # Pick a random action that will lead us to next state
        next_state = np.random.choice(playable_actions)
        # Computing Temporal Difference
        TD = rewards_new[current_state,next_state] + gamma * Q[next_state, np.argmax(Q[next_state,])] - Q[current_state,next_state]
        # Updating the Q-Value using the Bellman equation
        Q[current_state,next_state] += alpha * TD
 
    # Initialize the optimal route with the starting location
    route = [start_location]
    #Initialize next_location with starting location
    next_location = start_location
 
    # We don't know about the exact number of iterations needed to reach to the final location hence while loop will be a good choice for iteratiing
    while(next_location != end_location):
        # Fetch the starting state
        starting_state = location_to_state[start_location]
        # Fetch the highest Q-value pertaining to starting state
        next_state = np.argmax(Q[starting_state,])
        # We got the index of the next state. But we need the corresponding letter.
        next_location = state_to_location[next_state]
        route.append(next_location)
        # Update the starting location for the next iteration
        start_location = next_location
 
    return route

Step 4: Print the Route

print(get_optimal_route('L1', 'L9'))

With this, we come to an end of Q-Learning. I hope you got to know the working of Q Learning along with the various dependencies there are like the temporal Difference, Bellman Equation and more.

If you wish to check out more articles on the market’s most trending technologies like Artificial Intelligence, DevOps, Ethical Hacking, then you can refer to Edureka’s official site.

Do look out for other articles in this series which will explain the various other aspects of Deep Learning.

1. TensorFlow Tutorial

2. PyTorch Tutorial

3. Perceptron learning Algorithm

4. Neural Network Tutorial

5. What is Backpropagation?

6. Convolutional Neural Networks

7. Capsule Neural Networks

8. Recurrent Neural Networks

9. Autoencoders Tutorial

10. Restricted Boltzmann Machine Tutorial

11. PyTorch vs TensorFlow

12. Deep Learning With Python

13. Artificial Intelligence Tutorial

14. TensorFlow Image Classification

15. Artificial Intelligence Applications

16. How to Become an Artificial Intelligence Engineer?

17. Object Detection in TensorFlow

18. Apriori Algorithm

19. Markov Chains With Python

20. Artificial Intelligence Algorithms

21. Best Laptops for Machine Learning

22. Top 12 Artificial Intelligence Tools

23. Artificial Intelligence (AI) Interview Questions

24. Theano vs TensorFlow

25. What Is A Neural Network?

26. Pattern Recognition

27. Alpha Beta Pruning in Artificial Intelligence

Originally published at https://www.edureka.co on June 12, 2019.

Machine Learning
Q Learning
Artificial Intelligence
Reinforcement Learning
Python
Recommended from ReadMedium