
Robust deep reinforcement learning
Description
Book Introduction
The perfect way to build a solid foundation in deep reinforcement learning!
This book is an introduction to deep reinforcement learning that uniquely combines theory and practice.
It begins with an intuitive explanation, moves on to a detailed explanation of deep reinforcement learning algorithms and implementation methods using the SLM Lab library, and finally covers the details for applying deep reinforcement learning in practice.
This book is an introduction to deep reinforcement learning that uniquely combines theory and practice.
It begins with an intuitive explanation, moves on to a detailed explanation of deep reinforcement learning algorithms and implementation methods using the SLM Lab library, and finally covers the details for applying deep reinforcement learning in practice.
- You can preview some of the book's contents.
Preview
index
Translator's Preface xii
Beta Reader Review xiii
Recommendation xv
Beginning xvi
Acknowledgements xxi
CHAPTER 01 Introduction to Reinforcement Learning 1
1.1 Reinforcement Learning 1
1.2 Reinforcement Learning as an MDP 7
1.3 Functions Learned in Reinforcement Learning 11
1.4 Deep Reinforcement Learning Algorithm 13
1.4.1 Policy-Based Algorithm 14
1.4.2 Value-Based Algorithms 15
1.4.3 Model-Based Algorithms 16
1.4.4 Combined Method 17
1.4.5 Algorithms covered in this book 18
1.4.6 Active and Inactive Policy Algorithms 19
1.4.7 Summary 19
1.5 Deep Learning for Reinforcement Learning 20
1.6 Reinforcement Learning and Supervised Learning 22
1.6.1 Absence of Oracle 23
1.6.2 The Scarcity of Feedback 24
1.6.3 Data Generation 24
1.7 Summary 25
PART I Policy-Based and Value-Based Algorithms
CHAPTER 02 REINFORCE 29
2.1 Policy 30
2.2 Objective Function 31
2.3 Policy Slope 31
2.3.1 Policy Gradient Calculation 33
2.4 Monte Carlo Sampling 36
2.5 REINFORCE Algorithm 37
2.5.1 Improved REINFORCE 38
2.6 REINFORCE Implementation 39
2.6.1 Minimal REINFORCE Implementation 39
2.6.2 Creating Policies with PyTorch 42
2.6.3 Action Extraction 44
2.6.4 Policy Loss Calculation 45
2.6.5 REINFORCE Training Loop 46
2.6.6 Active Policy Replay Memory 47
2.7 Training of REINFORCE Agents 50
2.8 Experimental Results 53
2.8.1 Experiment: The Effect of Discount Rate ?? 53
2.8.2 Experiment: The Effect of Reference Values 55
2.9 Summary 57
2.10 Further Reading 57
2.11 History 58
CHAPTER 03 SARSA 59
3.1 Q function and V function 60
3.2 Time-lapse learning 63
3.2.1 Intuition about temporal difference learning 66
3.3 Salsa's Action Selection 73
3.3.1 Exploration and Utilization 74
3.4 Salsa Algorithm 75
3.4.1 Activation Policy Algorithm 76
3.5 Application of Salsa 77
3.5.1 Behavior Function: Epsilon-Greedy 77
3.5.2 Calculating Q Loss 78
3.5.3 Salsa Training Loop 80
3.5.4 Active Policy Deployment Reproduction Memory 81
3.6 Salsa Agent Training 83
3.7 Experimental Results 86
3.7.1 Experiment: The Effect of Learning Rate 86
3.8 Summary 87
3.9 Further Reading 88
3.10 History 89
CHAPTER 04 Deep Q Network (DQN) 91
4.1 Learning the Q Function of DQN 92
4.2 Action Selection in DQN 94
4.2.1 Boltzmann Policy 97
4.3 Experience Reproduction 100
4.4 DQN Algorithm 101
4.5 Application of DQN 103
4.5.1 Calculating Q Loss 103
4.5.2 DQN Training Loop 104
4.5.3 Reproduced Memory 105
4.6 Training the DQN Agent 108
4.7 Experimental Results 111
4.7.1 Experiment: The Effect of Neural Network Architecture 111
4.8 Summary 113
4.9 Further Reading 114
4.10 History 114
CHAPTER 05 Improved DQN 115
5.1 Target Network 116
5.2 Dual DQN 119
5.3 Prioritized Experience Reproduction (PER) 123
5.3.1 Importance Sampling 125
5.4 Implementation of the Modified DQN 126
5.4.1 Network Initialization 127
5.4.2 Calculating Q Loss 128
5.4.3 Target Network Update 129
5.4.4 DQN 130 with target network
5.4.5 Dual DQN 130
5.4.6 Reproducing Prioritized Experiences 131
5.5 Training a DQN Agent for Atari Games 137
5.6 Experimental Results 142
5.6.1 Experiment: The Effect of Dual DQN and PER 142
5.7 Summary 146
5.8 Further Reading 146
PART II Combined Methods
CHAPTER 06 Advantage Doer-Critic (A2C) 149
6.1 Actor 150
6.2 Critics 150
6.2.1 Advantage Function 151
6.2.2 Learning about the Advantage Function 155
6.3 A2C Algorithm 156
6.4 Implementation of A2C 159
6.4.1 Advantage Estimation 160
6.4.2 Calculating Value Loss and Policy Loss 162
6.4.3 Doer-Critic Training Loop 163
6.5 Network Architecture 164
6.6 Training the A2C Agent 166
6.6.1 Applying A2C with n-step gain to the Pong game 166
6.6.2 Applying A2C to Pong Game Using GAE 169
6.6.3 A2C 170 using n-step gain in the bipedal pedestrian problem
6.7 Experimental Results 173
6.7.1 Experiment: The Effect of n-Stage Gains 173
6.7.2 Experiment: The Effect of ?? on GAE 175
6.8 Summary 176
6.9 Further Reading 177
6.10 History 177
CHAPTER 07 Proximal Policy Optimization (PPO) 179
7.1 Proxy Purpose 180
7.1.1 Performance Collapse 180
7.1.2 Modifying the Objective Function 182
7.2 Proximal Policy Optimization (PPO) 189
7.3 PPO Algorithm 193
7.4 Implementation of PPO 195
7.4.1 Calculating PPO Policy Losses 195
7.4.2 PPO Training Loop 196
7.5 Training of PPO Agents 198
7.5.1 PPO 198 for Pong Game
7.5.2 PPO 201 for two-legged pedestrians
7.6 Experimental Results 203
7.6.1 Experiment: The Effect of ?? on GAE 204
7.6.2 Experiment: Effect of the Clipping Variable ?? 205
7.7 Summary 207
7.8 Further Reading 208
CHAPTER PARALLELIZATION METHODS 209
8.1 Synchronous Parallelism 210
8.2 Asynchronous Parallelism 212
8.2.1 Hogwild! 213
8.3 Training the A3C Agent 216
8.4 Summary 219
8.5 Further Reading 219
CHAPTER 09 Algorithm Summary 221
PART III Details for Practice
CHAPTER 10 Working with Deep Reinforcement Learning 225
10.1 Software Engineering Techniques 226
10.1.1 Unit Tests 226
10.1.2 Code Quality 232
10.1.3 Git Workflow 233
10.2 Debugging Tips 236
10.2.1 Survival Signal 236
10.2.2 Diagnosis of Policy Slope 237
10.2.3 Diagnosis of Data 238
10.2.4 Preprocessor 239
10.2.5 Memory 239
10.2.6 Algorithm Function 240
10.2.7 Neural Networks 240
10.2.8 Algorithm Simplification 243
10.2.9 Simplifying the Problem 243
10.2.10 Hyperparameter 244
10.2.11 Lab Workflow 244
10.3 Atari Trick 245
10.4 Deep Reinforcement Learning Almanac 249
10.4.1 Hyperparameter Table 249
10.4.2 Algorithm Performance Comparison 252
10.5 Summary 255
CHAPTER 11 SLM Lab 257
11.1 Algorithms Implemented in SLM Lab 257
11.2 spec file 260
11.2.1 Search Specification Syntax 262
11.3 Running SLM Lab 265
11.3.1 SLM Lab Command 265
11.4 Analysis of Experimental Results 266
11.4.1 Overview of Experimental Data 266
11.5 Summary 268
CHAPTER 12 NETWORK ARCHITECTURE 269
12.1 Types of Neural Networks 269
12.1.1 Multilayer Perceptron (MLP) 270
12.1.2 Convolutional Neural Networks (CNNs) 272
12.1.3 Recurrent Neural Networks (RNNs) 274
12.2 Guide to Selecting Network Groups 275
12.2.1 MDP and POMDP 275
12.2.2 Selecting a Network for Your Environment 279
12.3 Net API 282
12.3.1 Estimation of Input and Output Layer Shapes 284
12.3.2 Automatic Network Creation 286
12.3.3 Training Step 289
12.3.4 Exposure of base methods 290
12.4 Summary 291
12.5 Further Reading 292
CHAPTER 13 HARDWARE 293
13.1 Computer 294
13.2 Data Types 300
13.3 Data Type Optimization in Reinforcement Learning 302
13.4 Hardware Selection 307
13.5 Summary 308
CHAPTER 14 STATUS 311
Example 312 of State 14.1
14.2 Completeness of State 319
14.3 State Complexity 320
14.4 Loss of State Information 325
14.4.1 Image Grayscaling 325
14.4.2 Dioxide 326
14.4.3 Hash Dispatch 327
14.4.4 Metadata Loss 327
14.5 Preprocessing 331
14.5.1 Standardization 332
14.5.2 Image Processing 333
14.5.3 Temporal Preprocessing 335
14.6 Summary 339
CHAPTER 15: BEHAVIOR 341
15.1 Example of Action 341
15.2 Completeness of Action 345
15.3 The Complexity of Behavior 347
15.4 Summary 352
15.5 Further Reading: Designing Behaviors in Everyday Life 353
CHAPTER 16 REWARDS 357
16.1 The Role of Compensation 357
16.2 Guidelines for Compensation Design 359
16.3 Summary 364
CHAPTER 17 Transfer Functions 365
17.1 Feasibility Check 366
17.2 Reality Check 368
17.3 Summary 371
APPENDIX A: Deep Reinforcement Learning Timeline 372
APPENDIX B Environment Example 374
B.1 Discrete Environments 375
B.1.1 CartPole-v0 375
B.1.2 MountainCar-v0 376
B.1.3 LunarLander-v2 377
B.1.4 PongNoFrameskip-v4 378
B.1.5 BreakoutNoFrameskip-v4 378
B.2 Continuous Environment 379
B.2.1 Pendulum-v0 379
B.2.2 BipedalWalker-v2 380
Epilogue 381
Beta Reader Review xiii
Recommendation xv
Beginning xvi
Acknowledgements xxi
CHAPTER 01 Introduction to Reinforcement Learning 1
1.1 Reinforcement Learning 1
1.2 Reinforcement Learning as an MDP 7
1.3 Functions Learned in Reinforcement Learning 11
1.4 Deep Reinforcement Learning Algorithm 13
1.4.1 Policy-Based Algorithm 14
1.4.2 Value-Based Algorithms 15
1.4.3 Model-Based Algorithms 16
1.4.4 Combined Method 17
1.4.5 Algorithms covered in this book 18
1.4.6 Active and Inactive Policy Algorithms 19
1.4.7 Summary 19
1.5 Deep Learning for Reinforcement Learning 20
1.6 Reinforcement Learning and Supervised Learning 22
1.6.1 Absence of Oracle 23
1.6.2 The Scarcity of Feedback 24
1.6.3 Data Generation 24
1.7 Summary 25
PART I Policy-Based and Value-Based Algorithms
CHAPTER 02 REINFORCE 29
2.1 Policy 30
2.2 Objective Function 31
2.3 Policy Slope 31
2.3.1 Policy Gradient Calculation 33
2.4 Monte Carlo Sampling 36
2.5 REINFORCE Algorithm 37
2.5.1 Improved REINFORCE 38
2.6 REINFORCE Implementation 39
2.6.1 Minimal REINFORCE Implementation 39
2.6.2 Creating Policies with PyTorch 42
2.6.3 Action Extraction 44
2.6.4 Policy Loss Calculation 45
2.6.5 REINFORCE Training Loop 46
2.6.6 Active Policy Replay Memory 47
2.7 Training of REINFORCE Agents 50
2.8 Experimental Results 53
2.8.1 Experiment: The Effect of Discount Rate ?? 53
2.8.2 Experiment: The Effect of Reference Values 55
2.9 Summary 57
2.10 Further Reading 57
2.11 History 58
CHAPTER 03 SARSA 59
3.1 Q function and V function 60
3.2 Time-lapse learning 63
3.2.1 Intuition about temporal difference learning 66
3.3 Salsa's Action Selection 73
3.3.1 Exploration and Utilization 74
3.4 Salsa Algorithm 75
3.4.1 Activation Policy Algorithm 76
3.5 Application of Salsa 77
3.5.1 Behavior Function: Epsilon-Greedy 77
3.5.2 Calculating Q Loss 78
3.5.3 Salsa Training Loop 80
3.5.4 Active Policy Deployment Reproduction Memory 81
3.6 Salsa Agent Training 83
3.7 Experimental Results 86
3.7.1 Experiment: The Effect of Learning Rate 86
3.8 Summary 87
3.9 Further Reading 88
3.10 History 89
CHAPTER 04 Deep Q Network (DQN) 91
4.1 Learning the Q Function of DQN 92
4.2 Action Selection in DQN 94
4.2.1 Boltzmann Policy 97
4.3 Experience Reproduction 100
4.4 DQN Algorithm 101
4.5 Application of DQN 103
4.5.1 Calculating Q Loss 103
4.5.2 DQN Training Loop 104
4.5.3 Reproduced Memory 105
4.6 Training the DQN Agent 108
4.7 Experimental Results 111
4.7.1 Experiment: The Effect of Neural Network Architecture 111
4.8 Summary 113
4.9 Further Reading 114
4.10 History 114
CHAPTER 05 Improved DQN 115
5.1 Target Network 116
5.2 Dual DQN 119
5.3 Prioritized Experience Reproduction (PER) 123
5.3.1 Importance Sampling 125
5.4 Implementation of the Modified DQN 126
5.4.1 Network Initialization 127
5.4.2 Calculating Q Loss 128
5.4.3 Target Network Update 129
5.4.4 DQN 130 with target network
5.4.5 Dual DQN 130
5.4.6 Reproducing Prioritized Experiences 131
5.5 Training a DQN Agent for Atari Games 137
5.6 Experimental Results 142
5.6.1 Experiment: The Effect of Dual DQN and PER 142
5.7 Summary 146
5.8 Further Reading 146
PART II Combined Methods
CHAPTER 06 Advantage Doer-Critic (A2C) 149
6.1 Actor 150
6.2 Critics 150
6.2.1 Advantage Function 151
6.2.2 Learning about the Advantage Function 155
6.3 A2C Algorithm 156
6.4 Implementation of A2C 159
6.4.1 Advantage Estimation 160
6.4.2 Calculating Value Loss and Policy Loss 162
6.4.3 Doer-Critic Training Loop 163
6.5 Network Architecture 164
6.6 Training the A2C Agent 166
6.6.1 Applying A2C with n-step gain to the Pong game 166
6.6.2 Applying A2C to Pong Game Using GAE 169
6.6.3 A2C 170 using n-step gain in the bipedal pedestrian problem
6.7 Experimental Results 173
6.7.1 Experiment: The Effect of n-Stage Gains 173
6.7.2 Experiment: The Effect of ?? on GAE 175
6.8 Summary 176
6.9 Further Reading 177
6.10 History 177
CHAPTER 07 Proximal Policy Optimization (PPO) 179
7.1 Proxy Purpose 180
7.1.1 Performance Collapse 180
7.1.2 Modifying the Objective Function 182
7.2 Proximal Policy Optimization (PPO) 189
7.3 PPO Algorithm 193
7.4 Implementation of PPO 195
7.4.1 Calculating PPO Policy Losses 195
7.4.2 PPO Training Loop 196
7.5 Training of PPO Agents 198
7.5.1 PPO 198 for Pong Game
7.5.2 PPO 201 for two-legged pedestrians
7.6 Experimental Results 203
7.6.1 Experiment: The Effect of ?? on GAE 204
7.6.2 Experiment: Effect of the Clipping Variable ?? 205
7.7 Summary 207
7.8 Further Reading 208
CHAPTER PARALLELIZATION METHODS 209
8.1 Synchronous Parallelism 210
8.2 Asynchronous Parallelism 212
8.2.1 Hogwild! 213
8.3 Training the A3C Agent 216
8.4 Summary 219
8.5 Further Reading 219
CHAPTER 09 Algorithm Summary 221
PART III Details for Practice
CHAPTER 10 Working with Deep Reinforcement Learning 225
10.1 Software Engineering Techniques 226
10.1.1 Unit Tests 226
10.1.2 Code Quality 232
10.1.3 Git Workflow 233
10.2 Debugging Tips 236
10.2.1 Survival Signal 236
10.2.2 Diagnosis of Policy Slope 237
10.2.3 Diagnosis of Data 238
10.2.4 Preprocessor 239
10.2.5 Memory 239
10.2.6 Algorithm Function 240
10.2.7 Neural Networks 240
10.2.8 Algorithm Simplification 243
10.2.9 Simplifying the Problem 243
10.2.10 Hyperparameter 244
10.2.11 Lab Workflow 244
10.3 Atari Trick 245
10.4 Deep Reinforcement Learning Almanac 249
10.4.1 Hyperparameter Table 249
10.4.2 Algorithm Performance Comparison 252
10.5 Summary 255
CHAPTER 11 SLM Lab 257
11.1 Algorithms Implemented in SLM Lab 257
11.2 spec file 260
11.2.1 Search Specification Syntax 262
11.3 Running SLM Lab 265
11.3.1 SLM Lab Command 265
11.4 Analysis of Experimental Results 266
11.4.1 Overview of Experimental Data 266
11.5 Summary 268
CHAPTER 12 NETWORK ARCHITECTURE 269
12.1 Types of Neural Networks 269
12.1.1 Multilayer Perceptron (MLP) 270
12.1.2 Convolutional Neural Networks (CNNs) 272
12.1.3 Recurrent Neural Networks (RNNs) 274
12.2 Guide to Selecting Network Groups 275
12.2.1 MDP and POMDP 275
12.2.2 Selecting a Network for Your Environment 279
12.3 Net API 282
12.3.1 Estimation of Input and Output Layer Shapes 284
12.3.2 Automatic Network Creation 286
12.3.3 Training Step 289
12.3.4 Exposure of base methods 290
12.4 Summary 291
12.5 Further Reading 292
CHAPTER 13 HARDWARE 293
13.1 Computer 294
13.2 Data Types 300
13.3 Data Type Optimization in Reinforcement Learning 302
13.4 Hardware Selection 307
13.5 Summary 308
CHAPTER 14 STATUS 311
Example 312 of State 14.1
14.2 Completeness of State 319
14.3 State Complexity 320
14.4 Loss of State Information 325
14.4.1 Image Grayscaling 325
14.4.2 Dioxide 326
14.4.3 Hash Dispatch 327
14.4.4 Metadata Loss 327
14.5 Preprocessing 331
14.5.1 Standardization 332
14.5.2 Image Processing 333
14.5.3 Temporal Preprocessing 335
14.6 Summary 339
CHAPTER 15: BEHAVIOR 341
15.1 Example of Action 341
15.2 Completeness of Action 345
15.3 The Complexity of Behavior 347
15.4 Summary 352
15.5 Further Reading: Designing Behaviors in Everyday Life 353
CHAPTER 16 REWARDS 357
16.1 The Role of Compensation 357
16.2 Guidelines for Compensation Design 359
16.3 Summary 364
CHAPTER 17 Transfer Functions 365
17.1 Feasibility Check 366
17.2 Reality Check 368
17.3 Summary 371
APPENDIX A: Deep Reinforcement Learning Timeline 372
APPENDIX B Environment Example 374
B.1 Discrete Environments 375
B.1.1 CartPole-v0 375
B.1.2 MountainCar-v0 376
B.1.3 LunarLander-v2 377
B.1.4 PongNoFrameskip-v4 378
B.1.5 BreakoutNoFrameskip-v4 378
B.2 Continuous Environment 379
B.2.1 Pendulum-v0 379
B.2.2 BipedalWalker-v2 380
Epilogue 381
Detailed image
.jpg)
Into the book
This book introduces the entire process of deep reinforcement learning.
It begins by presenting intuition, then explains the theory and algorithms, and concludes with actual implementations and practical advice.
This is precisely why this book includes a library called SLM Lab, which contains implementation code for all the algorithms covered in this book.
In short, this book is exactly what we wish we had when we first started studying deep reinforcement learning.
--- p.18
Since 2012, deep learning has been successfully applied to a variety of problems and has contributed to the development of cutting-edge technologies in a wide range of fields, including computer vision, machine translation, natural language understanding, and speech synthesis.
As I write this, deep learning is the most powerful function approximation technique humans have ever created.
--- p.20
Deep reinforcement learning algorithms typically have many hyperparameters.
For example, the type of network, architecture, activation function, optimization technique, and learning rate must be determined.
More advanced neural network functions may include gradient clipping and learning rate decay schemes, which are only relevant in the 'deep' part of deep reinforcement learning!
--- p.50
The name 'Monte Carlo' doesn't mean anything in particular.
It is simply remembered as another expression for 'probabilistic estimation'.
But the origin of the name is interesting.
The name was suggested by Nicholas Metropolis, a physicist and computer designer who also coined the odd name MANIAC computer.
Metropolis heard the story of Ulam's uncle who borrowed money from his relatives simply because he 'had to go to Monte Carlo'.
After that, the name Monte Carlo seemed too appropriate to denote probabilistic estimation.
--- p.58
When designing a new reinforcement learning algorithm or component, it is necessary to prove that the designed algorithm is theoretically correct before implementation.
This is especially true when conducting research.
Similarly, when trying to solve a problem in a new environment, it is necessary to first confirm whether the problem is truly solvable with reinforcement learning before applying the algorithm.
This should be taken into consideration especially when developing applications.
If a reinforcement learning algorithm fails even though everything is theoretically correct and can be solved with reinforcement learning, it may be due to an implementation error.
If so, you need to debug your code.
--- p.226
In practice, forming higher-level patterns is equivalent to creating a control strategy using the original controls.
This is similar to how chords become simpler control strategies constructed from individual piano keys.
This technique is a kind of meta control, and people can do it at any time.
Currently, there is no way to enable reinforcement learning agents to design their own control strategies.
Therefore, meta control is required for the agent.
From the agent's perspective, we need to design higher-level patterns from a human perspective.
Sometimes, instead of expressing an action as a single, complex action, it can be expressed more simply by combining several sub-actions.
It begins by presenting intuition, then explains the theory and algorithms, and concludes with actual implementations and practical advice.
This is precisely why this book includes a library called SLM Lab, which contains implementation code for all the algorithms covered in this book.
In short, this book is exactly what we wish we had when we first started studying deep reinforcement learning.
--- p.18
Since 2012, deep learning has been successfully applied to a variety of problems and has contributed to the development of cutting-edge technologies in a wide range of fields, including computer vision, machine translation, natural language understanding, and speech synthesis.
As I write this, deep learning is the most powerful function approximation technique humans have ever created.
--- p.20
Deep reinforcement learning algorithms typically have many hyperparameters.
For example, the type of network, architecture, activation function, optimization technique, and learning rate must be determined.
More advanced neural network functions may include gradient clipping and learning rate decay schemes, which are only relevant in the 'deep' part of deep reinforcement learning!
--- p.50
The name 'Monte Carlo' doesn't mean anything in particular.
It is simply remembered as another expression for 'probabilistic estimation'.
But the origin of the name is interesting.
The name was suggested by Nicholas Metropolis, a physicist and computer designer who also coined the odd name MANIAC computer.
Metropolis heard the story of Ulam's uncle who borrowed money from his relatives simply because he 'had to go to Monte Carlo'.
After that, the name Monte Carlo seemed too appropriate to denote probabilistic estimation.
--- p.58
When designing a new reinforcement learning algorithm or component, it is necessary to prove that the designed algorithm is theoretically correct before implementation.
This is especially true when conducting research.
Similarly, when trying to solve a problem in a new environment, it is necessary to first confirm whether the problem is truly solvable with reinforcement learning before applying the algorithm.
This should be taken into consideration especially when developing applications.
If a reinforcement learning algorithm fails even though everything is theoretically correct and can be solved with reinforcement learning, it may be due to an implementation error.
If so, you need to debug your code.
--- p.226
In practice, forming higher-level patterns is equivalent to creating a control strategy using the original controls.
This is similar to how chords become simpler control strategies constructed from individual piano keys.
This technique is a kind of meta control, and people can do it at any time.
Currently, there is no way to enable reinforcement learning agents to design their own control strategies.
Therefore, meta control is required for the agent.
From the agent's perspective, we need to design higher-level patterns from a human perspective.
Sometimes, instead of expressing an action as a single, complex action, it can be expressed more simply by combining several sub-actions.
--- p.348
GOODS SPECIFICS
- Publication date: February 17, 2022
- Page count, weight, size: 428 pages | 188*245*21mm
- ISBN13: 9791191600674
- ISBN10: 119160067X
You may also like
카테고리
korean
korean