1-2-AX working memory task
Medical diagnostic method
- 4 min read
- 2 chapters
Related on Lably
Through Machine learning, Algorithm and Python (programming language)
It can be used as a test case for learning algorithms to test their ability to remember some old data. This task can be used to demonstrate the working memory abilities of algorithms like PBWM or Long short-term memory.
Description
The input of the task is a sequence of the numbers/letters 1, 2, A, X, B and Y, and additional distracting instances of 3, C and Z which should be ignored. For each character of input in sequence, the subject must respond with left (L) or right (R).
The two target sequences that the subject is looking for are A-X and B-Y. When the subject encounters a 1 they must switch to looking for A-X, and when they encounter a 2 they must switch to looking for B-Y.
While looking for A-X, if the subject encounters an X having seen an A previously (and similarly for a Y while looking for B-Y), and where that previous letter was not part of an earlier sequence, they respond R to mark the end of that sequence; their response to all other characters should be L.
Examples
Sign in to keep reading
One more chapter is free with a Lably account.
Requirements for algorithms
To solve this task, an algorithm must be able to both remember the last number 1 or 2 and the last letter A or B independently. We refer to this memory as the working memory. This memory must persist all other input. In addition, the algorithm must be able to strip out and ignore the letters C and Z.
Solutions
Pseudocode
For traditional computer models, both requirements are easy to solve. Here is some Python code (kind of pseudocode but works) where the function next_output gets one single number/letter as input and returns either a letter or nothing. next_outputs is there for convenience to operate on a whole sequence.
<span id="mwcw"></span><span class="n" id="mwdA">last_num</span> <span class="o" id="mwdQ">=</span> <span class="s2" id="mwdg">""</span> <span class="n" id="mwdw">last_letter</span> <span class="o" id="mweA">=</span> <span class="s2" id="mweQ">""</span> <span class="k" id="mweg">def</span> <span class="nf" id="mwew">next_output</span><span class="p" id="mwfA">(</span><span class="n" id="mwfQ">next_input</span><span class="p" id="mwfg">:</span> <span class="nb" id="mwfw">str</span><span class="p" id="mwgA">)</span> <span class="o" id="mwgQ">-></span> <span class="nb" id="mwgg">str</span> <span class="o" id="mwgw">|</span> <span class="kc" id="mwhA">None</span><span class="p" id="mwhQ">:</span> <span class="w" id="mwhg"> </span><span class="sd" id="mwhw">"""</span> <span class="sd" id="mwiA"> Args:</span> <span class="sd" id="mwiQ"> next_input: A string containing a single character.</span> <span class="sd" id="mwig"> Returns:</span> <span class="sd" id="mwiw"> A string containing the letters "L", "R" or None.</span> <span class="sd" id="mwjA"> Example:</span> <span class="sd" id="mwjQ"> >>> next_output("2")</span> <span class="sd" id="mwjg"> 'L'</span> <span class="sd" id="mwjw"> """</span> <span class="k" id="mwkA">global</span> <span class="n" id="mwkQ">last_num</span><span class="p" id="mwkg">,</span> <span class="n" id="mwkw">last_letter</span> <span class="k" id="mwlA">if</span> <span class="n" id="mwlQ">next_input</span> <span class="ow" id="mwlg">in</span> <span class="p" id="mwlw">[</span><span class="s2" id="mwmA">"1"</span><span class="p" id="mwmQ">,</span> <span class="s2" id="mwmg">"2"</span><span class="p" id="mwmw">]:</span> <span class="n" id="mwnA">last_num</span> <span class="o" id="mwnQ">=</span> <span class="n" id="mwng">next_input</span> <span class="n" id="mwnw">last_letter</span> <span class="o" id="mwoA">=</span> <span class="s2" id="mwoQ">""</span> <span class="k" id="mwog">return</span> <span class="s2" id="mwow">"L"</span> <span class="k" id="mwpA">elif</span> <span class="n" id="mwpQ">next_input</span> <span class="ow" id="mwpg">in</span> <span class="p" id="mwpw">[</span><span class="s2" id="mwqA">"A"</span><span class="p" id="mwqQ">,</span> <span class="s2" id="mwqg">"B"</span><span class="p" id="mwqw">]:</span> <span class="n" id="mwrA">last_letter</span> <span class="o" id="mwrQ">=</span> <span class="n" id="mwrg">next_input</span> <span class="k" id="mwrw">return</span> <span class="s2" id="mwsA">"L"</span> <span class="k" id="mwsQ">elif</span> <span class="n" id="mwsg">next_input</span> <span class="ow" id="mwsw">in</span> <span class="p" id="mwtA">[</span><span class="s2" id="mwtQ">"X"</span><span class="p" id="mwtg">,</span> <span class="s2" id="mwtw">"Y"</span><span class="p" id="mwuA">]:</span> <span class="n" id="mwuQ">seq</span> <span class="o" id="mwug">=</span> <span class="n" id="mwuw">last_num</span> <span class="o" id="mwvA">+</span> <span class="n" id="mwvQ">last_letter</span> <span class="o" id="mwvg">+</span> <span class="n" id="mwvw">next_input</span> <span class="n" id="mwwA">last_letter</span> <span class="o" id="mwwQ">=</span> <span class="n" id="mwwg">next_input</span> <span class="k" id="mwww">if</span> <span class="n" id="mwxA">seq</span> <span class="ow" id="mwxQ">in</span> <span class="p" id="mwxg">[</span><span class="s2" id="mwxw">"1AX"</span><span class="p" id="mwyA">,</span> <span class="s2" id="mwyQ">"2BY"</span><span class="p" id="mwyg">]:</span> <span class="k" id="mwyw">return</span> <span class="s2" id="mwzA">"R"</span> <span class="k" id="mwzQ">return</span> <span class="s2" id="mwzg">"L"</span> <span class="k" id="mwzw">return</span> <span class="kc" id="mw0A">None</span> <span class="k" id="mw0Q">def</span> <span class="nf" id="mw0g">next_outputs</span><span class="p" id="mw0w">(</span><span class="n" id="mw1A">next_inputs</span><span class="p" id="mw1Q">:</span> <span class="nb" id="mw1g">str</span><span class="p" id="mw1w">)</span> <span class="o" id="mw2A">-></span> <span class="nb" id="mw2Q">list</span><span class="p" id="mw2g">[</span><span class="nb" id="mw2w">str</span><span class="p" id="mw3A">]:</span> <span class="w" id="mw3Q"> </span><span class="sd" id="mw3g">"""</span> <span class="sd" id="mw3w"> Args:</span> <span class="sd" id="mw4A"> next_input: A string.</span> <span class="sd" id="mw4Q"> Returns:</span> <span class="sd" id="mw4g"> A list of strings containing the letters "L" or "R".</span> <span class="sd" id="mw4w"> Example:</span> <span class="sd" id="mw5A"> >>> next_outputs("21AAXBYAX")</span> <span class="sd" id="mw5Q"> ["L", "L", "L", "L", "R", "L", "L", "L", "R"]</span> <span class="sd" id="mw5g"> """</span> <span class="k" id="mw5w">return</span> <span class="p" id="mw6A">[</span><span class="n" id="mw6Q">next_output</span><span class="p" id="mw6g">(</span><span class="n" id="mw6w">c</span><span class="p" id="mw7A">)</span> <span class="k" id="mw7Q">for</span> <span class="n" id="mw7g">c</span> <span class="ow" id="mw7w">in</span> <span class="n" id="mw8A">next_inputs</span><span class="p" id="mw8Q">]</span>Example:
<span id="mw9Q"></span><span class="gp" id="mw9g">>>> </span><span class="n" id="mw9w">next_outputs</span><span class="p" id="mw-A">(</span><span class="s2" id="mw-Q">"21AAXBYAX"</span><span class="p" id="mw-g">)</span> <span class="go" id="mw-w">['L', 'L', 'L', 'L', 'R', 'L', 'L', 'L', 'R']</span> <span class="gp" id="mw_A">>>> </span><span class="n" id="mw_Q">next_outputs</span><span class="p" id="mw_g">(</span><span class="s2" id="mw_w">"12CBZY"</span><span class="p" id="mwAQA">)</span> <span class="go" id="mwAQE">['L', 'L', None, 'L', None, 'R']</span>
Finite-state machine
Similarly, this task can be solved in a straightforward way by a finite-state machine with 7 states (call them ---, 1--, 2--, 1A-, 2B-, 1AX, 2BY).
Neural network
This task is much more difficult for neural networks. For simple feedforward neural networks, this task is not solvable because feedforward networks don't have any working memory. Including working memory into neural networks is a difficult task. There have been several approaches like PBWM or Long short-term memory which have working memory, both are able to solve it.

