|
2 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
ਪੂਰਵ ਸ਼ਰਤਾਂ
ਇਸ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ OpenAI Gym ਨਾਂ ਦੀ ਲਾਇਬ੍ਰੇਰੀ ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ ਜੋ ਵੱਖ-ਵੱਖ ਵਾਤਾਵਰਣਾਂ ਦੀ ਨਕਲ ਕਰਦੀ ਹੈ। ਤੁਸੀਂ ਇਸ ਪਾਠ ਦਾ ਕੋਡ ਆਪਣੇ ਸਥਾਨਕ ਸਿਸਟਮ 'ਤੇ ਚਲਾ ਸਕਦੇ ਹੋ (ਜਿਵੇਂ ਕਿ Visual Studio Code ਤੋਂ), ਜਿਸ ਵਿੱਚ ਸਿਮੂਲੇਸ਼ਨ ਇੱਕ ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੁੱਲੇਗਾ। ਜਦੋਂ ਤੁਸੀਂ ਕੋਡ ਆਨਲਾਈਨ ਚਲਾਉਂਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਕੁਝ ਤਬਦੀਲੀਆਂ ਕਰਨ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਇੱਥੇ ਵਰਣਨ ਕੀਤਾ ਗਿਆ ਹੈ।
OpenAI Gym
ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ, ਖੇਡ ਦੇ ਨਿਯਮ ਅਤੇ ਸਥਿਤੀ ਨੂੰ ਅਸੀਂ ਆਪਣੇ ਆਪ ਬਣਾਈ Board
ਕਲਾਸ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਸੀ। ਇੱਥੇ ਅਸੀਂ ਇੱਕ ਖਾਸ ਸਿਮੂਲੇਸ਼ਨ ਵਾਤਾਵਰਣ ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ, ਜੋ ਬੈਲੰਸਿੰਗ ਪੋਲ ਦੇ ਭੌਤਿਕ ਵਿਗਿਆਨ ਦੀ ਨਕਲ ਕਰੇਗਾ। ਰੀਇਨਫੋਰਸਮੈਂਟ ਲਰਨਿੰਗ ਐਲਗੋਰਿਥਮਾਂ ਨੂੰ ਸਿਖਾਉਣ ਲਈ ਸਭ ਤੋਂ ਪ੍ਰਸਿੱਧ ਸਿਮੂਲੇਸ਼ਨ ਵਾਤਾਵਰਣਾਂ ਵਿੱਚੋਂ ਇੱਕ ਹੈ Gym, ਜਿਸਨੂੰ OpenAI ਦੁਆਰਾ ਸੰਭਾਲਿਆ ਜਾਂਦਾ ਹੈ। ਇਸ Gym ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਸੀਂ ਵੱਖ-ਵੱਖ ਵਾਤਾਵਰਣਾਂ ਨੂੰ ਬਣਾਉਣਗੇ, ਜਿਵੇਂ ਕਿ CartPole ਸਿਮੂਲੇਸ਼ਨ ਤੋਂ Atari ਗੇਮਾਂ ਤੱਕ।
Note: ਤੁਸੀਂ OpenAI Gym ਦੁਆਰਾ ਉਪਲਬਧ ਹੋਰ ਵਾਤਾਵਰਣਾਂ ਨੂੰ ਇੱਥੇ ਵੇਖ ਸਕਦੇ ਹੋ।
ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ Gym ਨੂੰ ਇੰਸਟਾਲ ਕਰੀਏ ਅਤੇ ਲੋੜੀਂਦੇ ਲਾਇਬ੍ਰੇਰੀਆਂ ਨੂੰ ਇੰਪੋਰਟ ਕਰੀਏ (ਕੋਡ ਬਲਾਕ 1):
import sys
!{sys.executable} -m pip install gym
import gym
import matplotlib.pyplot as plt
import numpy as np
import random
ਅਭਿਆਸ - CartPole ਵਾਤਾਵਰਣ ਸ਼ੁਰੂ ਕਰੋ
CartPole ਬੈਲੰਸਿੰਗ ਸਮੱਸਿਆ 'ਤੇ ਕੰਮ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਸੰਬੰਧਿਤ ਵਾਤਾਵਰਣ ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਹਰ ਵਾਤਾਵਰਣ ਨਾਲ ਜੁੜਿਆ ਹੁੰਦਾ ਹੈ:
-
Observation space, ਜੋ ਸਾਨੂੰ ਵਾਤਾਵਰਣ ਤੋਂ ਪ੍ਰਾਪਤ ਜਾਣਕਾਰੀ ਦੀ ਬਣਾਵਟ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ। CartPole ਸਮੱਸਿਆ ਲਈ, ਸਾਨੂੰ ਪੋਲ ਦੀ ਸਥਿਤੀ, ਗਤੀ ਅਤੇ ਕੁਝ ਹੋਰ ਮੁੱਲ ਪ੍ਰਾਪਤ ਹੁੰਦੇ ਹਨ।
-
Action space, ਜੋ ਸੰਭਾਵਿਤ ਕਿਰਿਆਵਾਂ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ। ਸਾਡੇ ਕੇਸ ਵਿੱਚ, Action space discrete ਹੈ, ਅਤੇ ਇਸ ਵਿੱਚ ਦੋ ਕਿਰਿਆਵਾਂ ਹਨ - ਖੱਬੇ ਅਤੇ ਸੱਜੇ। (ਕੋਡ ਬਲਾਕ 2)
-
ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਹੇਠਾਂ ਦਿੱਤਾ ਕੋਡ ਟਾਈਪ ਕਰੋ:
env = gym.make("CartPole-v1") print(env.action_space) print(env.observation_space) print(env.action_space.sample())
ਵਾਤਾਵਰਣ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ ਇਹ ਵੇਖਣ ਲਈ, ਆਓ 100 ਕਦਮਾਂ ਲਈ ਇੱਕ ਛੋਟੀ ਸਿਮੂਲੇਸ਼ਨ ਚਲਾਈਏ। ਹਰ ਕਦਮ 'ਤੇ, ਅਸੀਂ ਇੱਕ ਕਿਰਿਆ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਾਂ ਜੋ ਕੀਤੀ ਜਾਵੇਗੀ - ਇਸ ਸਿਮੂਲੇਸ਼ਨ ਵਿੱਚ ਅਸੀਂ ਸਿਰਫ਼ action_space
ਤੋਂ ਰੈਂਡਮ ਕਿਰਿਆ ਚੁਣਦੇ ਹਾਂ।
-
ਹੇਠਾਂ ਦਿੱਤਾ ਕੋਡ ਚਲਾਓ ਅਤੇ ਦੇਖੋ ਕਿ ਇਹ ਕੀ ਨਤੀਜਾ ਦਿੰਦਾ ਹੈ।
✅ ਯਾਦ ਰੱਖੋ ਕਿ ਇਹ ਕੋਡ ਸਥਾਨਕ Python ਇੰਸਟਾਲੇਸ਼ਨ 'ਤੇ ਚਲਾਉਣਾ ਪਸੰਦ ਕੀਤਾ ਜਾਂਦਾ ਹੈ! (ਕੋਡ ਬਲਾਕ 3)
env.reset() for i in range(100): env.render() env.step(env.action_space.sample()) env.close()
ਤੁਹਾਨੂੰ ਕੁਝ ਇਸ ਤਰ੍ਹਾਂ ਦੀ ਚਿੱਤਰਕਲਾ ਦੇਖਣੀ ਚਾਹੀਦੀ ਹੈ:
-
ਸਿਮੂਲੇਸ਼ਨ ਦੌਰਾਨ, ਸਾਨੂੰ ਕਿਰਿਆ ਕਰਨ ਲਈ ਅਵਲੋਕਨ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਦਰਅਸਲ,
step
ਫੰਕਸ਼ਨ ਮੌਜੂਦਾ ਅਵਲੋਕਨ, ਇੱਕ ਇਨਾਮ ਫੰਕਸ਼ਨ, ਅਤੇdone
ਫਲੈਗ ਵਾਪਸ ਕਰਦਾ ਹੈ ਜੋ ਇਹ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਸਿਮੂਲੇਸ਼ਨ ਜਾਰੀ ਰੱਖਣ ਦਾ ਕੋਈ ਮਤਲਬ ਹੈ ਜਾਂ ਨਹੀਂ: (ਕੋਡ ਬਲਾਕ 4)env.reset() done = False while not done: env.render() obs, rew, done, info = env.step(env.action_space.sample()) print(f"{obs} -> {rew}") env.close()
ਤੁਹਾਨੂੰ ਨੋਟਬੁੱਕ ਆਉਟਪੁੱਟ ਵਿੱਚ ਕੁਝ ਇਸ ਤਰ੍ਹਾਂ ਦੇਖਣ ਨੂੰ ਮਿਲੇਗਾ:
[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 ... [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0
ਸਿਮੂਲੇਸ਼ਨ ਦੇ ਹਰ ਕਦਮ 'ਤੇ ਵਾਪਸ ਕੀਤੇ ਗਏ ਅਵਲੋਕਨ ਵੇਕਟਰ ਵਿੱਚ ਹੇਠਾਂ ਦਿੱਤੇ ਮੁੱਲ ਸ਼ਾਮਲ ਹੁੰਦੇ ਹਨ:
- ਕਾਰਟ ਦੀ ਸਥਿਤੀ
- ਕਾਰਟ ਦੀ ਗਤੀ
- ਪੋਲ ਦਾ ਕੋਣ
- ਪੋਲ ਦੀ ਘੁੰਮਣ ਦੀ ਦਰ
-
ਉਹਨਾਂ ਨੰਬਰਾਂ ਦੇ ਘੱਟੋ-ਘੱਟ ਅਤੇ ਵੱਧ ਤੋਂ ਵੱਧ ਮੁੱਲ ਪ੍ਰਾਪਤ ਕਰੋ: (ਕੋਡ ਬਲਾਕ 5)
print(env.observation_space.low) print(env.observation_space.high)
ਤੁਸੀਂ ਇਹ ਵੀ ਨੋਟ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਹਰ ਸਿਮੂਲੇਸ਼ਨ ਕਦਮ 'ਤੇ ਇਨਾਮ ਦਾ ਮੁੱਲ ਹਮੇਸ਼ਾਂ 1 ਹੁੰਦਾ ਹੈ। ਇਹ ਇਸ ਲਈ ਹੈ ਕਿਉਂਕਿ ਸਾਡਾ ਲਕਸ਼ ਸਭ ਤੋਂ ਲੰਬੇ ਸਮੇਂ ਲਈ ਪੋਲ ਨੂੰ ਇੱਕ ਸਮਝਦਾਰ ਖੜੇ ਸਥਿਤੀ ਵਿੱਚ ਰੱਖਣਾ ਹੈ।
✅ ਦਰਅਸਲ, ਜੇਕਰ ਅਸੀਂ 100 ਲਗਾਤਾਰ ਪ੍ਰਯੋਗਾਂ ਵਿੱਚ 195 ਦਾ ਔਸਤ ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰ ਲੈਂਦੇ ਹਾਂ, ਤਾਂ CartPole ਸਿਮੂਲੇਸ਼ਨ ਨੂੰ ਹੱਲ ਕੀਤਾ ਮੰਨਿਆ ਜਾਂਦਾ ਹੈ।
ਸਥਿਤੀ ਡਿਸਕ੍ਰੀਟਾਈਜ਼ੇਸ਼ਨ
Q-Learning ਵਿੱਚ, ਸਾਨੂੰ Q-Table ਬਣਾਉਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ ਜੋ ਹਰ ਸਥਿਤੀ 'ਤੇ ਕੀ ਕਰਨਾ ਹੈ ਇਹ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ। ਇਹ ਕਰਨ ਲਈ, ਸਥਿਤੀ ਨੂੰ ਡਿਸਕ੍ਰੀਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਰਥਾਤ ਇਸ ਵਿੱਚ ਡਿਸਕ੍ਰੀਟ ਮੁੱਲਾਂ ਦੀ ਸੀਮਿਤ ਗਿਣਤੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ। ਇਸ ਲਈ, ਸਾਨੂੰ ਕਿਸੇ ਤਰੀਕੇ ਨਾਲ ਆਪਣੇ ਅਵਲੋਕਨਾਂ ਨੂੰ ਡਿਸਕ੍ਰੀਟ ਕਰਨਾ ਪਵੇਗਾ, ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਸਥਿਤੀਆਂ ਦੇ ਸੀਮਿਤ ਸੈੱਟ ਨਾਲ ਨਕਸ਼ਾ ਬਣਾਉਣਾ ਪਵੇਗਾ।
ਇਸ ਨੂੰ ਕਰਨ ਦੇ ਕੁਝ ਤਰੀਕੇ ਹਨ:
- ਬਿਨਾਂ ਵਿੱਚ ਵੰਡੋ। ਜੇਕਰ ਸਾਨੂੰ ਕਿਸੇ ਮੁੱਲ ਦੇ ਇੰਟਰਵਲ ਦਾ ਪਤਾ ਹੈ, ਤਾਂ ਅਸੀਂ ਇਸ ਇੰਟਰਵਲ ਨੂੰ ਕੁਝ ਬਿਨਾਂ ਵਿੱਚ ਵੰਡ ਸਕਦੇ ਹਾਂ, ਅਤੇ ਫਿਰ ਮੁੱਲ ਨੂੰ ਉਸ ਬਿਨ ਨੰਬਰ ਨਾਲ ਬਦਲ ਸਕਦੇ ਹਾਂ ਜਿਸ ਵਿੱਚ ਇਹ ਸ਼ਾਮਲ ਹੈ। ਇਹ numpy ਦੇ
digitize
ਵਿਧੀ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਇਸ ਮਾਮਲੇ ਵਿੱਚ, ਸਾਨੂੰ ਸਥਿਤੀ ਦੇ ਆਕਾਰ ਦਾ ਸਹੀ ਪਤਾ ਹੋਵੇਗਾ, ਕਿਉਂਕਿ ਇਹ ਡਿਜ਼ੀਟਲਾਈਜ਼ੇਸ਼ਨ ਲਈ ਚੁਣੇ ਗਏ ਬਿਨਾਂ ਦੀ ਗਿਣਤੀ 'ਤੇ ਨਿਰਭਰ ਕਰੇਗਾ।
✅ ਅਸੀਂ ਮੁੱਲਾਂ ਨੂੰ ਕਿਸੇ ਸੀਮਿਤ ਇੰਟਰਵਲ (ਜਿਵੇਂ -20 ਤੋਂ 20) ਵਿੱਚ ਲਿਆਉਣ ਲਈ ਰੇਖੀ ਇੰਟਰਪੋਲੇਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਾਂ, ਅਤੇ ਫਿਰ ਨੰਬਰਾਂ ਨੂੰ ਗੋਲ ਕਰਕੇ ਪੂਰਨ ਅੰਕਾਂ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹਾਂ। ਇਸ ਨਾਲ ਸਾਨੂੰ ਸਥਿਤੀ ਦੇ ਆਕਾਰ 'ਤੇ ਘੱਟ ਨਿਯੰਤਰਣ ਮਿਲਦਾ ਹੈ, ਖਾਸ ਕਰਕੇ ਜੇਕਰ ਸਾਨੂੰ ਇਨਪੁਟ ਮੁੱਲਾਂ ਦੀ ਸਹੀ ਸੀਮਾਵਾਂ ਦਾ ਪਤਾ ਨਹੀਂ ਹੈ। ਉਦਾਹਰਣ ਲਈ, ਸਾਡੇ ਕੇਸ ਵਿੱਚ 4 ਵਿੱਚੋਂ 2 ਮੁੱਲਾਂ ਦੀ ਉੱਪਰ/ਹੇਠਾਂ ਸੀਮਾ ਨਹੀਂ ਹੈ, ਜਿਸ ਨਾਲ ਸਥਿਤੀਆਂ ਦੀ ਅਨੰਤ ਗਿਣਤੀ ਹੋ ਸਕਦੀ ਹੈ।
ਸਾਡੇ ਉਦਾਹਰਣ ਵਿੱਚ, ਅਸੀਂ ਦੂਜੇ ਤਰੀਕੇ ਨਾਲ ਜਾਵਾਂਗੇ। ਜਿਵੇਂ ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ ਨੋਟ ਕਰ ਸਕਦੇ ਹੋ, ਅਸਪਸ਼ਟ ਉੱਪਰ/ਹੇਠਾਂ ਸੀਮਾਵਾਂ ਦੇ ਬਾਵਜੂਦ, ਉਹ ਮੁੱਲ ਕਦਰਾਂ ਹੀ ਕੁਝ ਸੀਮਿਤ ਇੰਟਰਵਲਾਂ ਤੋਂ ਬਾਹਰ ਲੈਂਦੇ ਹਨ, ਇਸ ਲਈ ਉਹ ਸਥਿਤੀਆਂ ਜਿਨ੍ਹਾਂ ਦੇ ਮੁੱਲ ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਨ, ਬਹੁਤ ਘੱਟ ਹੋਣਗੀਆਂ।
-
ਇੱਥੇ ਉਹ ਫੰਕਸ਼ਨ ਹੈ ਜੋ ਸਾਡੇ ਮਾਡਲ ਤੋਂ ਅਵਲੋਕਨ ਲਵੇਗਾ ਅਤੇ 4 ਪੂਰਨ ਅੰਕਾਂ ਦੇ ਟਿਊਪਲ ਦਾ ਉਤਪਾਦਨ ਕਰੇਗਾ: (ਕੋਡ ਬਲਾਕ 6)
def discretize(x): return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
-
ਆਓ ਬਿਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਹੋਰ ਡਿਸਕ੍ਰੀਟਾਈਜ਼ੇਸ਼ਨ ਵਿਧੀ ਦੀ ਵੀ ਪੜਚੋਲ ਕਰੀਏ: (ਕੋਡ ਬਲਾਕ 7)
def create_bins(i,num): return np.arange(num+1)*(i[1]-i[0])/num+i[0] print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10)) ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter nbins = [20,20,10,10] # number of bins for each parameter bins = [create_bins(ints[i],nbins[i]) for i in range(4)] def discretize_bins(x): return tuple(np.digitize(x[i],bins[i]) for i in range(4))
-
ਹੁਣ ਆਓ ਇੱਕ ਛੋਟੀ ਸਿਮੂਲੇਸ਼ਨ ਚਲਾਈਏ ਅਤੇ ਉਹਨਾਂ ਡਿਸਕ੍ਰੀਟ ਵਾਤਾਵਰਣ ਮੁੱਲਾਂ ਦਾ ਅਵਲੋਕਨ ਕਰੀਏ। ਦੋਵੇਂ
discretize
ਅਤੇdiscretize_bins
ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਵੇਖੋ ਕਿ ਕੀ ਕੋਈ ਫਰਕ ਹੈ।✅
discretize_bins
ਬਿਨ ਨੰਬਰ ਵਾਪਸ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ 0-ਅਧਾਰਿਤ ਹੁੰਦਾ ਹੈ। ਇਸ ਲਈ ਇਨਪੁਟ ਵੇਰੀਏਬਲ ਦੇ ਮੁੱਲਾਂ ਦੇ ਆਸ-ਪਾਸ 0 ਲਈ ਇਹ ਇੰਟਰਵਲ ਦੇ ਵਿਚਕਾਰੋਂ ਨੰਬਰ (10) ਵਾਪਸ ਕਰਦਾ ਹੈ।discretize
ਵਿੱਚ, ਅਸੀਂ ਆਉਟਪੁੱਟ ਮੁੱਲਾਂ ਦੀ ਰੇਂਜ ਦੀ ਚਿੰਤਾ ਨਹੀਂ ਕੀਤੀ, ਉਨ੍ਹਾਂ ਨੂੰ ਨਕਾਰਾਤਮਕ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੱਤੀ, ਇਸ ਲਈ ਸਥਿਤੀ ਮੁੱਲ ਸ਼ਿਫਟ ਨਹੀਂ ਹੁੰਦੇ, ਅਤੇ 0 ਦਾ ਅਰਥ 0 ਹੁੰਦਾ ਹੈ। (ਕੋਡ ਬਲਾਕ 8)env.reset() done = False while not done: #env.render() obs, rew, done, info = env.step(env.action_space.sample()) #print(discretize_bins(obs)) print(discretize(obs)) env.close()
✅ ਜੇਕਰ ਤੁਸੀਂ ਵਾਤਾਵਰਣ ਨੂੰ ਕਿਵੇਂ ਚਲਦਾ ਹੈ ਇਹ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ
env.render
ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀ ਲਾਈਨ ਨੂੰ ਅਨਕਮੈਂਟ ਕਰੋ। ਨਹੀਂ ਤਾਂ ਤੁਸੀਂ ਇਸਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾ ਸਕਦੇ ਹੋ, ਜੋ ਕਿ ਤੇਜ਼ ਹੈ। ਅਸੀਂ ਆਪਣੇ Q-Learning ਪ੍ਰਕਿਰਿਆ ਦੌਰਾਨ ਇਸ "ਅਦ੍ਰਿਸ਼" ਕਾਰਜ ਨੂੰ ਵਰਤਾਂਗੇ।
Q-Table ਦੀ ਬਣਾਵਟ
ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ, ਸਥਿਤੀ ਸਿਰਫ਼ 0 ਤੋਂ 8 ਦੇ ਨੰਬਰਾਂ ਦੀ ਇੱਕ ਜੋੜੀ ਸੀ, ਅਤੇ ਇਸ ਲਈ Q-Table ਨੂੰ numpy ਟੈਂਸਰ ਦੁਆਰਾ ਪ੍ਰਸਤੁਤ ਕਰਨਾ ਸੁਵਿਧਾਜਨਕ ਸੀ ਜਿਸਦਾ ਆਕਾਰ 8x8x2 ਸੀ। ਜੇਕਰ ਅਸੀਂ ਬਿਨ ਡਿਸਕ੍ਰੀਟਾਈਜ਼ੇਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਾਂ, ਤਾਂ ਸਾਡੇ ਸਥਿਤੀ ਵੇਕਟਰ ਦਾ ਆਕਾਰ ਵੀ ਪਤਾ ਹੈ, ਇਸ ਲਈ ਅਸੀਂ ਉਹੀ ਤਰੀਕਾ ਵਰਤ ਸਕਦੇ ਹਾਂ ਅਤੇ ਸਥਿਤੀ ਨੂੰ 20x20x10x10x2 ਦੇ ਐਰੇ ਦੁਆਰਾ ਪ੍ਰਸਤੁਤ ਕਰ ਸਕਦੇ ਹਾਂ (ਇੱਥੇ 2 ਐਕਸ਼ਨ ਸਪੇਸ ਦਾ ਆਕਾਰ ਹੈ, ਅਤੇ ਪਹਿਲੇ ਆਕਾਰ ਅਵਲੋਕਨ ਸਪੇਸ ਵਿੱਚ ਪ੍ਰਤੀਕ ਪੈਰਾਮੀਟਰਾਂ ਲਈ ਚੁਣੇ ਗਏ ਬਿਨਾਂ ਦੀ ਗਿਣਤੀ ਨੂੰ ਦਰਸਾਉਂਦੇ ਹਨ)।
ਹਾਲਾਂਕਿ, ਕਈ ਵਾਰ ਅਵਲੋਕਨ ਸਪੇਸ ਦੇ ਸਹੀ ਆਕਾਰ ਪਤਾ ਨਹੀਂ ਹੁੰਦੇ। discretize
ਫੰਕਸ਼ਨ ਦੇ ਕੇਸ ਵਿੱਚ, ਅਸੀਂ ਕਦੇ ਵੀ ਯਕੀਨੀ ਨਹੀਂ ਹੋ ਸਕਦੇ ਕਿ ਸਾਡੀ ਸਥਿਤੀ ਕੁਝ ਸੀਮਾਵਾਂ ਦੇ ਅੰਦਰ ਰਹਿੰਦੀ ਹੈ, ਕਿਉਂਕਿ ਕੁਝ ਮੁੱਲ ਬਾਊਂਡ ਨਹੀਂ ਹਨ। ਇਸ ਲਈ, ਅਸੀਂ ਥੋੜ੍ਹਾ ਵੱਖਰਾ ਤਰੀਕਾ ਵਰਤਾਂਗੇ ਅਤੇ Q-Table ਨੂੰ ਡਿਕਸ਼ਨਰੀ ਦੁਆਰਾ ਪ੍ਰਸਤੁਤ ਕਰਾਂਗੇ।
-
ਡਿਕਸ਼ਨਰੀ ਕੁੰਜੀ ਵਜੋਂ (state,action) ਦੀ ਜੋੜੀ ਦੀ ਵਰਤੋਂ ਕਰੋ, ਅਤੇ ਮੁੱਲ Q-Table ਐਂਟਰੀ ਮੁੱਲ ਨੂੰ ਦਰਸਾਏਗਾ। (ਕੋਡ ਬਲਾਕ 9)
Q = {} actions = (0,1) def qvalues(state): return [Q.get((state,a),0) for a in actions]
ਇੱਥੇ ਅਸੀਂ ਇੱਕ ਫੰਕਸ਼ਨ
qvalues()
ਵੀ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੇ ਹਾਂ, ਜੋ ਦਿੱਤੀ ਸਥਿਤੀ ਲਈ Q-Table ਮੁੱਲਾਂ ਦੀ ਸੂਚੀ ਵਾਪਸ ਕਰਦਾ ਹੈ ਜੋ ਸਾਰੀਆਂ ਸੰਭਾਵਿਤ ਕਿਰਿਆਵਾਂ ਨਾਲ ਸੰਬੰਧਿਤ ਹੁੰਦੀ ਹੈ। ਜੇਕਰ ਐਂਟਰੀ Q-Table ਵਿੱਚ ਮੌਜੂਦ ਨਹੀਂ ਹੈ, ਤਾਂ ਅਸੀਂ ਡਿਫਾਲਟ ਵਜੋਂ 0 ਵਾਪਸ ਕਰਾਂਗੇ।
ਆਓ Q-Learning ਸ਼ੁਰੂ ਕਰੀਏ
ਹੁਣ ਅਸੀਂ ਪੀਟਰ ਨੂੰ ਬੈਲੈਂਸ ਸਿਖਾਉਣ ਲਈ ਤਿਆਰ ਹਾਂ!
-
ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਕੁਝ ਹਾਈਪਰਪੈਰਾਮੀਟਰ ਸੈੱਟ ਕਰੀਏ: (ਕੋਡ ਬਲਾਕ 10)
# hyperparameters alpha = 0.3 gamma = 0.9 epsilon = 0.90
ਇੱਥੇ,
alpha
ਲਰਨਿੰਗ ਰੇਟ ਹੈ ਜੋ ਇਹ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ ਕਿ ਸਾਡੇ Q-Table ਦੇ ਮੌਜੂਦਾ ਮੁੱਲਾਂ ਨੂੰ ਹਰ ਕਦਮ 'ਤੇ ਕਿੰਨਾ ਸਮਾਯੋਜਿਤ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਪਿਛਲੇ ਪਾਠ ਵਿੱਚ ਅਸੀਂ 1 ਨਾਲ ਸ਼ੁਰੂ ਕੀਤਾ ਸੀ, ਅਤੇ ਫਿਰ ਸਿਖਲਾਈ ਦੌਰਾਨalpha
ਨੂੰ ਘਟਾਇਆ ਸੀ। ਇਸ ਉਦਾਹਰਣ ਵਿੱਚ ਅਸੀਂ ਸਿਰਫ਼ ਸਧਾਰਨਤਾ ਲਈ ਇਸਨੂੰ ਸਥਿਰ ਰੱਖਾਂਗੇ, ਅਤੇ ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚalpha
ਮੁੱਲਾਂ ਨੂੰ ਸਹੀ ਕਰਨ ਦੇ ਨਾਲ ਪ੍ਰਯੋਗ ਕਰ ਸਕਦੇ ਹੋ।gamma
ਡਿਸਕਾਊਂਟ ਫੈਕਟਰ ਹੈ ਜੋ ਇਹ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਸਾਨੂੰ ਭਵਿੱਖ ਦੇ ਇਨਾਮ ਨੂੰ ਮੌਜੂਦਾ ਇਨਾਮ ਦੇ ਮੁਕਾਬਲੇ ਕਿੰਨਾ ਮਹੱਤਵ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ।epsilon
ਐਕਸਪਲੋਰੇਸ਼ਨ/ਐਕਸਪਲੋਇਟੇਸ਼ਨ ਫੈਕਟਰ ਹੈ ਜੋ ਇਹ ਨਿਰਧਾਰਤ ਕਰਦਾ ਹੈ ਕਿ ਸਾਨੂੰ ਐਕਸਪਲੋਰੇਸ਼ਨ ਨੂੰ ਐਕਸਪਲੋਇਟੇਸ਼ਨ ਦੇ ਮੁਕਾਬਲੇ ਕਿੰਨਾ ਤਰਜੀਹ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ। ਸਾਡੇ ਐਲਗੋਰਿਥਮ ਵਿੱਚ, ਅਸੀਂepsilon
ਪ੍ਰਤੀਸ਼ਤ ਮਾਮਲਿਆਂ ਵਿੱਚ Q-Table ਮੁੱਲਾਂ ਦੇ ਅਨੁਸਾਰ ਅਗਲੀ ਕਿਰਿਆ ਚੁਣਾਂਗੇ, ਅਤੇ ਬਾਕੀ ਮਾਮਲਿਆਂ ਵਿੱਚ ਅਸੀਂ ਇੱਕ ਰੈਂਡਮ ਕਿਰਿਆ ਚਲਾਵਾਂਗੇ। ਇਹ ਸਾਨੂੰ ਖੋਜ ਸਪੇਸ ਦੇ ਉਹਨਾਂ ਖੇਤਰਾਂ ਦੀ ਪੜਚੋਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਵੇਗਾ ਜੋ ਅਸੀਂ ਪਹਿਲਾਂ ਕਦੇ ਨਹੀਂ ਵੇਖੇ।✅ ਬੈਲੈਂਸਿੰਗ ਦੇ ਸੰਦਰਭ ਵਿੱਚ - ਰੈਂਡਮ ਕਿਰਿਆ ਚੁਣਨਾ (ਐਕਸਪਲੋਰੇਸ਼ਨ) ਗਲਤ ਦਿਸ਼ਾ ਵਿੱਚ ਇੱਕ ਰੈਂਡਮ ਝਟਕੇ ਵਜੋਂ ਕੰਮ ਕਰੇਗਾ, ਅਤੇ ਪੋਲ ਨੂੰ ਉਹਨਾਂ "ਗਲਤੀਆਂ" ਤੋਂ ਬੈਲੈਂਸ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਿੱਖਣਾ ਪਵੇਗਾ।
ਐਲਗੋਰਿਥਮ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ
ਅਸੀਂ ਪਿਛਲੇ ਪਾਠ ਤੋਂ ਆਪਣੇ ਐਲਗੋਰਿਥਮ ਵਿੱਚ ਦੋ ਸੁਧਾਰ ਕਰ ਸਕਦੇ ਹਾਂ:
-
ਔਸਤ ਸੰਚਿਤ ਇਨਾਮ ਦੀ ਗਣਨਾ ਕਰੋ, ਕਈ ਸਿਮੂਲੇਸ਼ਨਾਂ ਦੇ ਦੌਰਾਨ। ਅਸੀਂ ਹਰ 5000 ਇਟਰੇਸ਼ਨ 'ਤੇ ਪ੍ਰਗਤੀ ਪ੍ਰਿੰਟ ਕਰਾਂਗੇ, ਅਤੇ ਅਸੀਂ ਉਸ ਸਮੇਂ ਦੇ ਦੌਰਾਨ ਆਪਣੇ ਸੰਚਿਤ ਇਨਾਮ ਦਾ ਔਸਤ ਲਵਾਂਗੇ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਜੇਕਰ ਅਸੀਂ 195 ਤੋਂ ਵੱਧ ਪਾਇੰਟ ਪ੍ਰਾਪਤ ਕਰਦੇ ਹਾਂ - ਅਸੀਂ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਮੰਨ ਸਕਦੇ ਹਾਂ, ਜੋ ਲੋੜੀਂਦੇ ਮਿਆਰ ਨਾਲੋਂ ਵੀ ਉੱਚ ਗੁਣਵੱਤਾ ਵਾਲਾ ਹੈ।
-
ਅਧਿਕਤਮ ਔਸਤ ਸੰਚਿਤ ਨਤੀਜੇ ਦੀ ਗਣਨਾ ਕਰੋ,
Qmax
, ਅਤੇ ਅਸੀਂ ਉਸ ਨ
ਕਿਰਿਆ 1: ਹਾਈਪਰਪੈਰਾਮੀਟਰ ਮੁੱਲਾਂ ਨਾਲ ਖੇਡੋ ਅਤੇ ਵੇਖੋ ਕਿ ਕੀ ਤੁਸੀਂ ਵਧੇਰੇ ਕੁੱਲ ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਕੀ ਤੁਸੀਂ 195 ਤੋਂ ਉੱਪਰ ਪ੍ਰਾਪਤ ਕਰ ਰਹੇ ਹੋ? ਟਾਸਕ 2: ਸਮੱਸਿਆ ਨੂੰ ਔਪਚਾਰਿਕ ਤੌਰ 'ਤੇ ਹੱਲ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ 100 ਲਗਾਤਾਰ ਦੌੜਾਂ ਵਿੱਚ 195 ਔਸਤ ਇਨਾਮ ਪ੍ਰਾਪਤ ਕਰਨਾ ਹੋਵੇਗਾ। ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ ਇਸਨੂੰ ਮਾਪੋ ਅਤੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਸੀਂ ਸਮੱਸਿਆ ਨੂੰ ਔਪਚਾਰਿਕ ਤੌਰ 'ਤੇ ਹੱਲ ਕਰ ਲਿਆ ਹੈ!
ਨਤੀਜੇ ਨੂੰ ਕਾਰਵਾਈ ਵਿੱਚ ਦੇਖਣਾ
ਇਹ ਦਿਲਚਸਪ ਹੋਵੇਗਾ ਕਿ ਸੱਚਮੁੱਚ ਦੇਖਿਆ ਜਾਵੇ ਕਿ ਟ੍ਰੇਨ ਕੀਤੇ ਮਾਡਲ ਦਾ ਵਿਹਾਰ ਕਿਵੇਂ ਹੈ। ਆਓ ਸਿਮੂਲੇਸ਼ਨ ਚਲਾਈਏ ਅਤੇ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ ਵਰਤੀ ਗਈ ਇੱਕੋ ਜਿਹੀ ਐਕਸ਼ਨ ਚੋਣ ਰਣਨੀਤੀ ਦੀ ਪਾਲਣਾ ਕਰੀਏ, Q-ਟੇਬਲ ਵਿੱਚ ਸੰਭਾਵਨਾ ਵੰਡ ਅਨੁਸਾਰ ਸੈਂਪਲਿੰਗ ਕਰਦੇ ਹੋਏ: (ਕੋਡ ਬਲਾਕ 13)
obs = env.reset()
done = False
while not done:
s = discretize(obs)
env.render()
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
obs,_,done,_ = env.step(a)
env.close()
ਤੁਹਾਨੂੰ ਕੁਝ ਇਸ ਤਰ੍ਹਾਂ ਦੇਖਣ ਨੂੰ ਮਿਲੇਗਾ:
🚀ਚੁਣੌਤੀ
ਟਾਸਕ 3: ਇੱਥੇ, ਅਸੀਂ Q-ਟੇਬਲ ਦੀ ਅੰਤਮ ਕਾਪੀ ਵਰਤ ਰਹੇ ਸਾਂ, ਜੋ ਸ਼ਾਇਦ ਸਭ ਤੋਂ ਵਧੀਆ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਯਾਦ ਰੱਖੋ ਕਿ ਅਸੀਂ ਸਭ ਤੋਂ ਵਧੀਆ ਪ੍ਰਦਰਸ਼ਨ ਕਰਨ ਵਾਲੀ Q-ਟੇਬਲ ਨੂੰ
Qbest
ਵੈਰੀਏਬਲ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਹੈ!Qbest
ਨੂੰQ
ਵਿੱਚ ਕਾਪੀ ਕਰਕੇ ਅਤੇ ਇਹ ਦੇਖ ਕੇ ਕਿ ਕੀ ਤੁਸੀਂ ਕੋਈ ਅੰਤਰ ਮਹਿਸੂਸ ਕਰਦੇ ਹੋ, ਇਸੇ ਉਦਾਹਰਨ ਨੂੰ ਸਭ ਤੋਂ ਵਧੀਆ Q-ਟੇਬਲ ਨਾਲ ਅਜ਼ਮਾਓ।
ਟਾਸਕ 4: ਇੱਥੇ ਅਸੀਂ ਹਰ ਕਦਮ 'ਤੇ ਸਭ ਤੋਂ ਵਧੀਆ ਕਾਰਵਾਈ ਨਹੀਂ ਚੁਣ ਰਹੇ ਸਾਂ, ਸਗੋਂ ਸੰਭਾਵਨਾ ਵੰਡ ਦੇ ਅਨੁਸਾਰ ਸੈਂਪਲਿੰਗ ਕਰ ਰਹੇ ਸਾਂ। ਕੀ ਹਮੇਸ਼ਾ ਸਭ ਤੋਂ ਵਧੀਆ ਕਾਰਵਾਈ ਚੁਣਨਾ ਵਧੀਆ ਹੋਵੇਗਾ, ਜਿਸਦਾ Q-ਟੇਬਲ ਮੁੱਲ ਸਭ ਤੋਂ ਉੱਚਾ ਹੈ? ਇਹ
np.argmax
ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਜੋ ਸਭ ਤੋਂ ਉੱਚੇ Q-ਟੇਬਲ ਮੁੱਲ ਦੇ ਅਨੁਸਾਰ ਕਾਰਵਾਈ ਨੰਬਰ ਦਾ ਪਤਾ ਲਗਾਉਂਦਾ ਹੈ। ਇਸ ਰਣਨੀਤੀ ਨੂੰ ਲਾਗੂ ਕਰੋ ਅਤੇ ਦੇਖੋ ਕਿ ਕੀ ਇਹ ਸੰਤੁਲਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰਦਾ ਹੈ।
ਪੋਸਟ-ਲੈਕਚਰ ਕਵਿਜ਼
ਅਸਾਈਨਮੈਂਟ
ਨਿਸਕਰਸ਼
ਅਸੀਂ ਹੁਣ ਸਿੱਖ ਲਿਆ ਹੈ ਕਿ ਕੇਵਲ ਇੱਕ ਇਨਾਮ ਫੰਕਸ਼ਨ ਪ੍ਰਦਾਨ ਕਰਕੇ, ਜੋ ਖੇਡ ਦੀ ਇੱਛਿਤ ਸਥਿਤੀ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ, ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਸਮਰਥਕ ਤਰੀਕੇ ਨਾਲ ਖੋਜ ਸਥਾਨ ਦੀ ਪੜਚੋਲ ਕਰਨ ਦਾ ਮੌਕਾ ਦੇ ਕੇ, ਏਜੰਟਾਂ ਨੂੰ ਚੰਗੇ ਨਤੀਜੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਕਿਵੇਂ ਟ੍ਰੇਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਅਸੀਂ ਸਫਲਤਾਪੂਰਵਕ Q-ਲਰਨਿੰਗ ਐਲਗੋਰਿਥਮ ਨੂੰ ਵਿਸ਼ੇਸ਼ ਅਤੇ ਲਗਾਤਾਰ ਵਾਤਾਵਰਣ ਦੇ ਮਾਮਲਿਆਂ ਵਿੱਚ ਲਾਗੂ ਕੀਤਾ ਹੈ, ਪਰ ਵਿਸ਼ੇਸ਼ ਕਾਰਵਾਈਆਂ ਨਾਲ।
ਇਹ ਵੀ ਅਹਿਮ ਹੈ ਕਿ ਉਹ ਸਥਿਤੀਆਂ ਦਾ ਅਧਿਐਨ ਕੀਤਾ ਜਾਵੇ ਜਿੱਥੇ ਕਾਰਵਾਈ ਸਥਿਤੀ ਵੀ ਲਗਾਤਾਰ ਹੁੰਦੀ ਹੈ, ਅਤੇ ਜਦੋਂ ਅਵਲੋਕਨ ਸਥਾਨ ਕਾਫੀ ਜਟਿਲ ਹੁੰਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ Atari ਗੇਮ ਸਕ੍ਰੀਨ ਤੋਂ ਚਿੱਤਰ। ਉਹਨਾਂ ਸਮੱਸਿਆਵਾਂ ਵਿੱਚ ਅਕਸਰ ਚੰਗੇ ਨਤੀਜੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਹੋਰ ਸ਼ਕਤੀਸ਼ਾਲੀ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਤਕਨੀਕਾਂ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਨਿਊਰਲ ਨੈਟਵਰਕ। ਇਹ ਹੋਰ ਅਗਰਸਰ ਵਿਸ਼ੇ ਅਸੀਂ ਆਪਣੇ ਆਉਣ ਵਾਲੇ ਅਗਰਸਰ AI ਕੋਰਸ ਵਿੱਚ ਕਵਰ ਕਰਾਂਗੇ।
ਅਸਵੀਕਾਰਨਾ:
ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ Co-op Translator ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚਨਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।