V_V comments on Debunking Fallacies in the Theory of AI Motivation - Less Wrong

8 Post author: Richard_Loosemore 05 May 2015 02:46AM

You are viewing a comment permalink. View the original post to see all comments and the full post content.

Comments (343)

You are viewing a single comment's thread. Show more comments above.

Comment author: Vaniver 05 May 2015 05:23:22PM *  8 points [-]

Well, if you or I were to suggest that the best way to achieve universal human happiness was to forcibly rewire the brain of everyone on the planet so they became happy when sitting in bottles of dopamine, most other human beings would probably take that as a sign of insanity.

Richard, I know (real!) people who think that wireheading is the correct approach to life, who would do it to themselves if it were feasible, and who would vote for political candidates if they pledged to legalize or fund research into wireheading. (I realize this is different from forcible wireheading, but unless I've misjudged your position seriously I don't think you see the lack of consent as the only serious issue with that proposal.)

I disagree with those people; I don't want to wirehead myself. But I notice that I am uncertain about many issues:

  1. Should they be allowed to wirehead? Relatedly, is it cruel of me to desire that they not wirehead themselves? Both of these issues are closely related to the issue of suicide--I do, at present, think it should be legal for others to kill themselves, and that it would be cruel of me to desire that they not kill themselves, rather than desiring that they not want to kill themselves.

  2. Are there philosophical foundations that I could rely on to convince them that, while they might want to wirehead now, after reflecting on those foundations, they would not want to wirehead? Do I endorse those foundations for myself, or am I mistaken in not wanting to wirehead?

  3. How should my feelings on wireheading impact my feelings on related issues, like video gaming? I definitely became much more ambivalent about my video gaming hobby when I saw the parallels to wireheading, and the generalized case of superstimuli deserves philosophical attention. But it could be instead that, by endorsing video gaming (at least for others), that means I should also endorse wireheading, as just the best possible video game.

It seems to me that, rather than acknowledging that these questions are serious and unanswered, and thus seeking to find answers, you instead seek to dismiss those questions as not worth asking, and thus not worth answering. I feel like this is the wrong approach to philosophy, for many reasons.

I also suspect that this attitude generalizes: there are many places where I see Yudkowsky and similar thinkers saying "hold on a minute, what feature of reality can we point to that generates X?" and you seem to be responding with "but clearly X will be generated," or "but superintelligence will generate X." Is it actually clear? Will it be obvious in prospect that an AI design is superintelligent at determining what we want, rather than just obvious in retrospect? What features of the AI design should we be looking for?

For example, you point out that Swarm Relaxation Intelligences (SRIs) lack some dangerous features of CLAIs. This seems like a move in the right direction, but a proof of safety is not just the absence of known errors. It seems wise to let safety and verifiability drive our design choices, and to develop a strong understanding of what features lead to what guarantees (or, at least, what evidence in favor of safety or alignment).

Comment author: V_V 06 May 2015 03:41:03PM *  4 points [-]

I agree with everything in this comment up to:

with functional programs, it is possible to ensure through type-checking that certain classes of errors cannot occur. With imperative programs, all testing can do is ensure the presence of errors (with absence of evidence being evidence of absence--but not proof of absence).

This doesn't appear to be correct given that you can always transform functional programs into imperative programs and vice versa.

I've never heard that you can program in functional languages without doing testing and relying only on type checking to ensure correct behavior.

In fact, AFAIK, Haskell, the most popular pure functional programming language, is bad enough that you actually have to test all non-trivial programs for memory leaks, since it is not possible to reason except for special cases about the memory allocation behavior of a program from its source code and the language specification: the allocation behavior depends on implementation-specific and largely undocumented details of the compiler and the runtime.
Anyway, this memory allocation issue may be specific to Haskell, but in general, as I understand, there is nothing in the functional paradigm that guarantees a higher level of correctness than the imperative paradigm.

Comment author: Vaniver 06 May 2015 04:26:38PM *  2 points [-]

I've never heard that you can program in functional languages without doing testing and relying only on type checking to ensure correct behavior.

"Certain classes of errors" is meant to be read as a very narrow claim, and I'm not sure that it's relevant to AI design / moral issues. Many sorts of philosophical errors seem to be type errors, but it's not obvious that typechecking is the only solution to that. I was primarily drawing on this bit from Programming in Scala, and in rereading it I realize that they're actually talking about static type systems, which is an entirely separate thing. Editing.

Verifiable properties. Static type systems can prove the absence of certain run-time errors. For instance, they can prove properties like: booleans are never added to integers; private variables are not accessed from outside their class; functions are applied to the right number of arguments; only strings are ever added to a set of strings.

Other kinds of errors are not detected by today's static type systems. For instance, they will usually not detect non-terminating functions, array bounds violations, or divisions by zero. They will also not detect that your program does not conform to its specification (assuming there is a spec, that is!). Static type systems have therefore been dismissed by some as not being very useful. The argument goes that since such type systems can only detect simple errors, whereas unit tests provide more extensive coverage, why bother with static types at all? We believe that these arguments miss the point. Although a static type system certainly cannot replace unit testing, it can reduce the number of unit tests needed by taking care of some properties that would otherwise need to be tested. Likewise, unit testing can not replace static typing. After all, as Edsger Dijkstra said, testing can only prove the presence of errors, never their absence.[14] So the guarantees that static typing gives may be simple, but they are real guarantees of a form no amount of testing can deliver.

Comment author: V_V 06 May 2015 04:38:23PM 2 points [-]

Ok, sorry for being nitpicky.

Comment author: Vaniver 06 May 2015 04:53:05PM 2 points [-]

In case it wasn't clear, thanks for nitpicking, because I was confused and am not confused about that anymore.

Comment author: Vladimir_Nesov 06 May 2015 08:11:17PM 1 point [-]

This doesn't appear to be correct given that you can always transform functional programs into imperative programs and vice versa.

The relevant difference is in isolation and formulation of side effects, which encourages formulation of more pieces of code whose behavior can be understood precisely in most situations. The toolset of functional programming is usually better for writing higher order code that keeps the sources of side effects abstract, so that they are put back separately, without affecting the rest of the code. As a result, a lot of code can have well-defined behavior that's not disrupted by context in which it's used.

This works even without types, but with types the discipline can be more systematically followed, sometimes enforced. It also becomes possible to offload some of the formulation-checking work to a compiler (even when the behavior of a piece of code is well-defined and possible to understand precisely, there is the additional step of making sure it's used appropriately).

I've never heard that you can program in functional languages without doing testing and relying only on type checking to ensure correct behavior.

See Why Haskell just works. It's obviously not magic, the point is that enough errors can be ruled out by exploiting types and relying on spare use of side effects to make a difference in practice. This doesn't ensure correct behavior (for example, Haskell programs can always enter an infinite loop, while promising to eventually produce a value of any type, and Standard ML programs can use side effects that won't be reflected in types). It's just a step in the right direction, when correctness is a priority. There is also a prospect that more steps in this direction might eventually get you closer to correctness.

Comment author: IlyaShpitser 07 May 2015 09:31:43PM *  5 points [-]

tangent:

I used to love functional programming and the elegance of e.g. Haskell, until I realized functional programming has the philosophy exactly backwards. You want to make it easy for humans and hard for machines, not vice versa.

Human think causally, e.g. imperatively and statefully. When humans debug functional/lazy programs, they generally smuggle in stateful/causal thinking to make progress. This is a sign something is going wrong with the philosophy.

Comment author: [deleted] 13 May 2015 02:23:01PM *  -1 points [-]

Hm. The primary reason I got interested in fp is that I really like SQL, I think it is very easy for the human mind. And LINQ is built on top of functional programming, the Gigamonkeys book buils a similar query language on top of functional programming and macros, so it seems perhaps fp should be used that way, taking it as far as possible towards making query languages in it.

But I guess it always depends on what you want to do. My philosophy of programming is automation based. That means, if I need to do something once, I do it by hand, if a thousand times I write code. This, the ability to repeat operations many times, is what makes automating human work possible and from this I derived that the most important imperative structure is the loop. The loop is what turns something that was a mere set of rules into a powerfol data processing machinery, doing an operation many more times than I care to do it. With SQL, LINQ and other queries, we are essentially optimizing the loop as such. For example the generator expression in Python is a neat little functional loop-replacement, mini-query language.

Comment author: V_V 06 May 2015 10:12:19PM *  1 point [-]

The relevant difference is in isolation and formulation of side effects, which encourages formulation of more pieces of code whose behavior can be understood precisely in most situations. The toolset of functional programming is usually better for writing higher order code that keeps the sources of side effects abstract, so that they are put back separately, without affecting the rest of the code. As a result, a lot of code can have well-defined behavior that's not disrupted by context in which it's used.

Yes, that's how it was intended to be and how they spin it, but in practice the abstraction is leaky and it leaks in bad, difficult to predict ways therefore, as I said, you end up with things like having to test for memory leaks, something that is usually not an issue in "imperative" languages like Java, C# or Python.

I like the functional paradigm inside a good multi-paradigm language: passing around closures as first-class objects is much cleaner and concise than fiddling with subclasses and virtual methods, but forcing immutability and lazy evaluation as the main principles of the language doesn't seem to be a good design choice. It forces you to jump through hoops to implement common functionality like interaction, logging or configuration, and in return it doesn't deliver the higher modularity and intelligibility that were promised.

Anyway, we are going OT.

Comment author: Vladimir_Nesov 06 May 2015 10:49:36PM 0 points [-]

Agreed. Abstractions are still leaky, and where some pathologies in abstraction (i.e. human-understandable precise formulation) can be made much less of an issue by using the functional tools and types, others tend to surface that are only rarely a problem for more concrete code. In practice, the tradeoff is not one-sided, so its structure is useful for making decisions in particular cases.